拦截器(interceptor)的作用
Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方 法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。
拦截器和过滤器区别
自定义拦截器很简单,只有如下三步:
① 创建拦截器类实现HandlerInterceptor接口
② 配置拦截器
③ 测试拦截器的拦截效果
下面直接上代码 然后我们在注释里面讲解即可:
第一步 ① 创建拦截器类实现HandlerInterceptor接口
package com.bihu; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //第一步 创建类 然后实现HandlerIntercepto接口{有兴趣可以去看看底层代码} public class MyHandlerInterceptor implements HandlerInterceptor { //在拦截前执行这个方法 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { /*** * 这个方法返回一个布尔型的值,若true则都执行下面的方法 post 和 after * 如果返回值是false ,那么返回的只执行这个方法,不执行下面方法。 */ System.out.println("我是preHandle 方法 我在拦截前执行"); return false; //如果我返回的是false 下面的方法都不执行 } //在控制器执行方法后返回视图前(数据未发送出去)执行这个方法 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("我是postHandle方法 上面的preHandle 返回true 了 我执行了"); } //在控制器什么都执行完之后才执行这个方法 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("我是afterCompletion方法,我是控制器方法全部执行后(视图也返回了) 我执行了!"); } }
然后 配置一下 让MVC知道有这么个东西
<!-- 配置拦截器 【用mvc标签interceptors】 加了个s 证明复数--> <mvc:interceptors> <mvc:interceptor> <!--下面的/** 表示拦截所有的控制器(访问) ,bean是一个参数 地址是你设置的拦截器--> <mvc:mapping path="/**"/> <bean class="com.bihu.MyHandlerInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
然后测试一下 看下拦截器 preHandle返回的是真的时候 就可以访问全部,返回false 那么就拦截掉了:
package com.bihu.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; public class TestController { @RequestMapping("/show") public String show(Model model){ model.addAttribute("data","成功返回 未被拦截!"); return "TestJSP"; } }
然后结果如下:
1. 当拦截器 pre方法返回false ,只执行pre方法,然后访问的页面空白。(逻辑上你可以给个提示 说权限)
2. 如果返回true,都执行,然后也正常跳转 相当于没有拦截器一样。
成功运行:
注意一个点! 拦截器只拦截控制器的方法,如果是页面首页那些直接访问jsp的(除了绑定在控制器中返回的JSP) 不会拦截的!! 注意这个点 千万了啊! 所以你一般吧不空开的视图放到web-inf....
在写登录的时候 拦截权限 其他都拦截/** 但是不拦截登录的请求 那么就是
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/user/login"/> <bean class="com.bihu.Interceptor.jurisdiction"></bean> </mvc:interceptor> </mvc:interceptors>
其实就是这个标签:
<mvc:exclude-mapping path="/user/login"/>
可以理解为放行标签【不拦截】