发表于: 2020-06-25 23:37:43
1 1692
今天完成的事情:
学习了一下springmvc的拦截器,之前学习springmvc的时候没有学这一块,现在做任务五发现添加登录模块需要使用拦截器。
1,SpringMVC拦截器的作用。
SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。
2,拦截器与过滤器的区别:
过滤器 | 拦截器 |
---|---|
servlet规范中的一部分,任何java web工程都可以使用 | 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用 |
在url-pattern中配置了/* 之后,可以对所有要访问的资源进行拦截 | 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的 |
步骤:
1,编写拦截器类,实现HandlerInterceptor接口。
HandlerInterceptor接口中的方法已经实现过了,不需要我们再次实现,如果需要修改可以重写方法。
主要有三个方法:
preHandle:在进入Handler方法执行之前执行此方法,即在HandlerAdapter执行目标方法之前执行。一般用于:如身份认证,身份授权。
postHandle:在进入Handler方法之后,返回ModelAndView之前执行,即在HandlerAdapter执行目标方法之后,在配置的视图解析器ViewResoulver解析成真正物理视图之前执行。一般用于:将公用模型数据(如菜单导航)在这里传到视图,也可以在这里统一制定视图。
afterCompletion:在View渲染视图之后,响应给浏览端之前调用。一般用于:统一日志处理,统一异常处理。
public class MyInterceptor1 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor1执行了。。。");
return true;
}
}
return true:放行,执行下一个拦截器,如果没有则执行controller中的方法。
return false:不放心
2,配置拦截器。
在springmvc.xml中配置拦截器:
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/*"/>
<!--<mvc:exclude-mapping path=""/>-->
<!--配置拦截器对象-->
<bean class="Interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
mvc:mapping path=拦截的请求路径
mvc:exclude-mapping path=不拦截的请求路径
二者只能取其一。
编写UserController:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testInterceptor")
public String testInterceptor(){
System.out.println("testInterceptor执行了。。。");
return "success";
}
}
/user/testInterceptor发送请求测试:
可以看到拦截器成功执行了.
测试一下剩下两个方法:
在自定义拦截器中加入下面两个方法:
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor1执行了。。。后111");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor1执行了。。。最后111");
}
同时在跳转页面success.jsp页面中加入:
<% System.out.println("success执行了。。。");%>
发送请求测试:
返回结果:
可以看到三个方法执行的时机。
关于多个拦截器执行的顺序:
1,在所有拦截器preHandle方法皆返回true情况下,拦截器的执行顺序为FDFE(First define first execute)翻译过来就是先定义后执行。
eg:
定义了ABC拦截器,且在SpringMVC定义的顺序为A、B、C,则拦截器内部的执行顺序为:
A.preHandle 方法
B.preHandle 方法
C.preHandle 方法
C.postHandle 方法
B.postHandle 方法
A.postHandle 方法
C.afterCompletion 方法
B.afterCompletion 方法
A.afterCompletion 方法
preHandle是顺序执行的,postHandle与afterCompletion方法倒序执行的。
2.在某个拦截器的preHandle返回false时,将执行返回false拦截器之前(包括此拦截器)的所有preHandle方法及afterCompletion方法(不包括返回false的拦截器)。
收获:学会了怎么使用springmvc拦截器
明天计划完成的事情:
编写登录注册模块
评论