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不能再跳转页面了

本文 暂无 评论

Top