八.拦截器
在处理Handler业务方法之前或者之后以及响应到达之前做一些额外的处理
可以将一些相关的操作封装成拦截器,进行额外的处理
1.开发步骤
1-1 创建一个Java类
该类实现HandlerInterceptor接口
不同Spring版本需求也不一样
- 在Spring5中已经对这些方法做了默认的实现
- 因此,可以根据需求选择性的重写部分的方法
- 在Spring4中并没有对这些方法做任何的实现
- 因此,必须重写所有的方法
public class LogHandlerInterceptor implements HandlerInterceptor {
/**
* 在处理核心业务逻辑之前执行
* @param request 请求对象
* @param response 响应对象
* @param handler Handler对象
* @return 是否放行,true-放行,false-不放行
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("LogHandlerInterceptor.preHandle");
return false;
}
/**
* 在处理核心业务逻辑之后执行
* @param request
* @param response
* @param handler
* @param modelAndView 目标Handler的视图与模型
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("LogHandlerInterceptor.postHandle");
}
/**
* 在响应到达之前执行
* @param request
* @param response
* @param handler
* @param e 遇到的异常
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) throws Exception {
System.out.println("LogHandlerInterceptor.afterCompletion");
}
}
1-2 配置拦截器
在SpringMVC配置文件中进行配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截谁,哪些请求会进入拦截器进行处理,支持通配符 -->
<mvc:mapping path="/log/**"/>
<!--
不拦截谁,哪些请求不仅如此拦截器进行处理
此处配置的请求一般是属于存在mapping配置的请求中的
可以配置多个
-->
<mvc:exclude-mapping path="/log/add"/>
<mvc:exclude-mapping path="/log/find"/>
<!-- 拦截器是谁 -->
<bean class="interceptor.LogHandlerInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2.练习
实现登录检查拦截器
当用户没有登录的时候,无法访问当前工程中的除登录相关之外的任意资源
只有用户登录之后,才能正常访问
public class CheckLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
User user = (User) request.getSession().getAttribute("user");
if(user == null){
request.setAttribute("loginMsg","请先登录");
request.getRequestDispatcher("/showLogin").forward(request,response);
return false;
}
return true;
}
}
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/showLogin"/>
<mvc:exclude-mapping path="/resp/f8"/>
<bean class="interceptor.CheckLoginInterceptor"/>
</mvc:interceptor>