day03-自定义struts2拦截器

1. 拦截器的概述
    * 拦截器就是AOP(Aspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)
    * 过滤器:过滤从客服端发送到服务器端请求的

    * 拦截器:拦截对目标Action中的某些方法进行拦截(登录方法需要放行)
        * 拦截器不能拦截JSP
        * 拦截到Action中某些方法

2. 拦截器和过滤器的区别
    1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的
    2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
    3)拦截器只能对Action请求起作用(Action中的方法),而过滤器可以对几乎所有的请求起作用(CSS JSP JS)

    * 拦截器 采用 责任链 模式
        > 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链
        > 责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行

    * 在struts2 中可以定义很多个拦截器,将多个拦截器按照特定顺序 组成拦截器栈 (顺序调用 栈中的每一个拦截器 )

3. Struts2的核心是拦截器,看一下Struts2的运行流程
编写拦截器类

需要继承struts2框架的MethodFilterInterceptor

提供工具类:

**

 * BOS项目的工具类

 * @authorzhaoqx

 *

 */

publicclass BOSUtils {

         //获取session对象

         publicstatic HttpSession getSession(){

                   return ServletActionContext.getRequest().getSession();

         }

         //获取登录用户对象

         publicstatic User getLoginUser(){

                   return (User) getSession().getAttribute("loginUser");

         }

} 编写拦截器

/**

 * 自定义的拦截器,实现用户未登录自动跳转到登录页面

 * @authorzhaoqx

 *

 */

publicclass BOSLoginInterceptorextends MethodFilterInterceptor{

         //拦截方法

         protected String doIntercept(ActionInvocation invocation) throws Exception {

                   //session中获取用户对象

                   User user = BOSUtils.getLoginUser();

                   if(user == null){

                            //没有登录,跳转到登录页面

                            return"login";

                   }

                   //放行

                   returninvocation.invoke();

         }

}

在struts.xml中配置拦截器

<interceptors>

                            <!-- 注册自定义拦截器 -->

                            <interceptor name="bosLoginInterceptor"class="com.itheima.bos.web.interceptor.BOSLoginInterceptor">

                                     <!-- 指定哪些方法不需要拦截 -->

                                     <param name="excludeMethods">login</param>

                            </interceptor>

                            <!-- 定义拦截器栈 -->

                            <interceptor-stack name="myStack">

                                     <interceptor-ref name="bosLoginInterceptor"></interceptor-ref>

                                     <interceptor-ref name="defaultStack"></interceptor-ref>

                            </interceptor-stack>

                   </interceptors>

                   <default-interceptor-ref name="myStack"/>

                  

                   <!-- 全局结果集定义 -->

                   <global-results>

                            <result name="login">/login.jsp</result>

                   </global-results>

猜你喜欢

转载自blog.csdn.net/qq_38796823/article/details/78305432