今天在项目中用到了检查用户功能,第一次接触花了不少时间,记录下来;
struts2定义拦截器(Interceptor)检查用户是否已经登录,此功能用来防止用户用不正当的方法访问正当的页面进行不正当的操作。
第一步:写代码,定义拦截器。
定义拦截器的方法有很多,这里就不全部列举了,我是直接继承MethodFilterInterceptor,
public class LoginInterceptor extends MethodFilterInterceptor {
private static final long serialVersionUID = 1L;
@Override
protected String doIntercept(ActionInvocation ai) throws Exception {
//定义ActionContext 用来获取session ,request, response对象
//以下是在普通类中获取HttpServletRequest和HttpServletResponse的方法
ActionContext actionContext = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest) actionContext.get(ServletActionContext.HTTP_REQUEST) ;
HttpServletResponse response = (HttpServletResponse) actionContext.get(ServletActionContext.HTTP_RESPONSE);
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
//获取session,检查用户是否已经登录,注意此处的return null;很主要,防止页面多次访问
User user = (User)actionContext.getSession().get("login");
if(user == null){
//return "login" 如果没有用户登录则转向此页面,basePath用来防止路径出错
response.sendRedirect(basePath+"index.jsp");
return null;
}
return ai.invoke();
}
}
第二步:配置struts.xml
<package name="oa_default" extends="struts-default" >
<!-- 验证用户登录 -->
<interceptor name="Login" class="com.panlong.web.interceptor.LoginInterceptor"/>
<interceptor-stack name="LoginInterceptor">
<interceptor-ref name="Login">
<!-- <param name="includeMethods">list,del</param> -->
<param name="excludeMethods">log</param>
</interceptor-ref>
<interceptor-ref name="SystemException" />
</interceptor-stack>
</interceptors>
</package>
说明:<param name="excludeMethods">log</param>是用来排除某些方法使用此拦截器,比如登录的方法就要被拦截。因为在登录前是没有用户存在的。还有此拦截器不能设置成默认的拦截,这样会在登录进去后发生一系列错误。<interceptor-ref name="SystemException" /> 这里我用的默认的interceptor。
以下是在action中配置interceptor:
<!-- 人员 -->
<package name="person" extends="oa_default" namespace="/person">
<action name="index">
<result>/person/Person_list.jsp</result>
</action>
<action name="*_*" class="com.panlong.action.{1}Action" method="{2}">
<interceptor-ref name="LoginInterceptor"></interceptor-ref>
<result>/person/{1}_{2}.jsp</result>
<result name="input">/person/{1}_{2}.jsp</result>
</action>
</package>
好了,大功告成,美中不足的是这种interceptor不能用来拦截jsp页面,所以要想拦截jsp页面我们还要继续写filter,下一篇开始filter
java技术社区QQ群:48482847欢迎你的加入!