对用户的登录信息进行验证,拦截非法用户的访问在开发中是非常常见的,下面是本人在学习中对拦截器的一些理解及配置:
1、编写一个登录的拦截器类loginInterceptor,继承MethodFilterInterceptor:
public class LoginInterceptor extends MethodFilterInterceptor { @Override public String doIntercept(ActionInvocation invocation) throws Exception { return null; } } |
//关于Interceptor、AbstractInterceptor和MethodFilterInterceptor三者的关系读者可以自己搜索
2、在重写的方法体里面对要验证的用户信息进行判断,如果为空,则返回登录页面;否则,跳转到登录页面:
//获取session里面的用户信息 Object obj = ActionContext.getContext().getSession().get("loginStaff"); if(obj == null){ /**友好信息 start*/ // 1 获得当前运行action Object action = invocation.getAction(); // 2 判断运行时是否是ActionSupport if(action instanceof ActionSupport){ ActionSupport actionSupport = (ActionSupport) action; actionSupport.addFieldError("", "请登录"); } /**友好信息 end*/ // 没有登录,需要登录 return "login"; } //登录,放行 return invocation.invoke(); |
3、在struts2的配置文件中配置
<!-- 2.2 拦截器配置 第一步>>>先声明拦截器: <interceptor name="loginInterceptor" class="拦截器类的全限定名"></interceptor> 第二步>>>自定义拦截器: 方法1:每一个action单独使用,需要多次引用,否则默认拦截器将被覆盖 <action name=""> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loginInterceptor"></interceptor-ref> </action>
方法2:将多个拦截器打包生成自定义栈,action使用栈 * 自定义拦截器栈 <interceptor-stack name="loginStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loginInterceptor"></interceptor-ref> </interceptor-stack> * action引用 <action name=""> <interceptor-ref name="loginStack"></interceptor-ref> </action>
方法3:将自定义栈把默认栈覆盖 <default-interceptor-ref name="loginStack"></default-interceptor-ref> --> <interceptors> <!-- @1)声明(注册) --> <interceptor name="loginInterceptor" class="com.itheima.crm.web.interceptor.LoginInterceptor"></interceptor> <!-- @2)自定义拦截器栈 --> <interceptor-stack name="loginStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 自定义拦截需要对login不进行拦截 * excludeMethods 配置不进行拦截的方法,多个方法使用逗号分隔 * includemethods 配置进行拦截的方法,多个方法使用逗号分隔 --> <interceptor-ref name="loginInterceptor"> <param name="excludeMethods">login</param> </interceptor-ref> </interceptor-stack> </interceptors>
<!-- @3)声明默认 --> <default-interceptor-ref name="loginStack"></default-interceptor-ref> <!—因为对所有的页面进行拦截时,都会返回一个login页面,所有定义一个全局的结果集 --> <!-- @4)全局结果集 --> <global-results> <result name="login">/WEB-INF/pages/login.jsp</result> </global-results> |
以上就是本人对拦截器的一些理解,如有不足,还望指出!