SpringMVC拦截器
SpringMV的处理器拦截功能类似于Servlet规范中的过滤器Filter,用于对处理器Handle进行预处理和后处理 ,区别就是和Filter加载的时机不一样
开发步骤:创建一个自定义 的拦截器实现HandleInterceptor接口,该接口定义了我三个方法
public class MyInterceptor01 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// chain.doFilter(req,resp)
// false 拦截客户端发送的请求,前提是必须经过前端控制器 弱与Filter过滤器
System.out.println(request+"--------------");
System.out.println(response+"-----------------");
System.out.println(handler+"------------------");
// 逻辑判断
// 如果用户已经登录了,那么应该进行资源放行
Object user = request.getSession().getAttribute("login_user");
if (user != null) {
// 登录过 用户经过校验了
return true;
}
// 跳转到登录页面
response.sendRedirect(request.getContextPath() + "/index.jsp");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(request+"====================");
System.out.println(response+"====================");
System.out.println(handler+"====================");
System.out.println(modelAndView+"====================");
/**
* 主要就是对 ModelAndView modelAndView 数据和视图做处理
*/
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(request+"++++++++++++++++++++++");
System.out.println(response+"++++++++++++++++++++++");
System.out.println(handler+"++++++++++++++++++++++");
System.out.println(ex+"++++++++++++++++++++++");
/**
* 资源的释放 查看一些请求服务器的日志
*
*/
}
preHandle:预处理回调方法,实现处理器的预处理,在客户端请求到达控制器之前做一次拦截(登录效验或则权限验证)
该方法中有几个参数
HttpServletRequest:请求对象
HttpServletResponse:响应对象
Object处理对象(响应的处理器)
还有返回值:boolean布尔类型 如果返回值为false,则地阿比到拦截该请求不到达控制器,相当于此次的请求就结束了,此时我们可以respones来进行响应,如果返回值是true,则代表放行客户端的请求
postHanle:后处理回调的方法,控制器中的代码已经加载完毕(在组装ModelAndView独享之前) 此时你可以在该方法中电仪ModelAndVIew中的数据。指定model中的传输的数据和制定跳转的试图地址,你可以把它设置为null
afterCompletion:在整个方法请求结束后,组装完ModelAndView对象,即将传输给前端控制器之前拦截。
上面操作完成后在springmvc.xml文件中设置自定义拦截器 交给spring容器管理
<!--配置自定义的拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--映射后端服务器的请求的资源路径 ** 代表所有包含子目录中的请求 .. -->
<mvc:mapping path="/**"/>
<!--放行登录的请求资源-->
<!--排除那些资源不拦截-->
<mvc:exclude-mapping path="/user/login.action"/>
<!-- <mvc:exclude-mapping path="/role/**"/>-->
<bean class="com.zhiyou100.web.interceptor.MyInterceptor01"/>
</mvc:interceptor>
<!--配置多个拦截器-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/login.action"/>
<bean class="com.zhiyou100.web.interceptor.MyInterceptor02"/>
</mvc:interceptor>
</mvc:interceptors>