SpringMVC拦截器

😂 这篇文章最后更新于1737天前,您需要注意相关的内容是否还可用。
目录导航
  • SpringMVC拦截器
    • 自定义拦截器步骤
  • SpringMVC拦截器

    SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。

    可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。

    拦截器和过滤器的功能比较类似,有区别

    1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。 
    2. 拦截器是SpringMVC框架独有的,因此只对控制器方法产生作用。 
    3. 过滤器配置了/*,可以拦截任何资源,因此静态资源需要在配置中排除。

    springmvc.xml配置静态资源过滤

    <!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/scripts/" mapping="/javascript/**"/>

    拦截器只会对控制器中的方法进行拦截。

    拦截器也是AOP思想的一种实现方式

    想要自定义拦截器,需要实现HandlerInterceptor接口,然后根据需要重写里面方法。

    简而言之拦截器就是对控制层执行前后进行处理的工具,之前学过的@ModelAttribute注解也可以对Controller参数进行预处理,只是@ModelAttribute只是将处理好参数返给控制器了。拦截器明显可以做更多事,例如看请求中是否包含某信息,不包含则跳转到错误页面,包含则正常执行控制层。

    自定义拦截器步骤

    创建类,实现HandlerInterceptor接口,idea按ctrl+o重写需要方法,返回true放行,反之拦截。可以做登录前的验证,未登录预处理重定向或转发跳转到登录页面。

    public class MyInterceptor1 implements HandlerInterceptor {
        /**
         * controller方法执行前,进行拦截的方法
         * return true放行
         * return false拦截
         * 可以使用转发或者重定向直接跳转到指定的页面。
         */
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                                 Object handler)
                throws Exception {
            System.out.println("拦截器执行了...");
            return true;
        }
    }

    配置springmvc.xml,以下配置了两拦截器,执行顺序,12->Controller->21->JSP->21

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 哪些方法进行拦截 -->
            <mvc:mapping path="/user/*"/>
            <!-- 哪些方法不进行拦截
            <mvc:exclude-mapping path=""/>
            -->
            <!-- 注册拦截器对象 -->
            <bean class="cn.cheng.demo1.MyInterceptor1"/>
        </mvc:interceptor>
        
            <mvc:interceptor>
            <!-- 哪些方法进行拦截 -->
            <mvc:mapping path="/**"/>
            <!-- 哪些方法不进行拦截
            <mvc:exclude-mapping path=""/>
            -->
            <!-- 注册拦截器对象 -->
            <bean class="cn.cheng.demo1.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>
    1. preHandle方法是controller方法执行前拦截的方法

      1. 可以使用request或者response跳转到指定的页面

      2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。

      3. return false不放行,不会执行controller中的方法。

    2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。

      1. 可以使用request或者response跳转到指定的页面

      2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。

    3. afterHandle方法是在JSP执行后执行

      1. request或者response不能再跳转页面了