目录
一、拦截器的介绍
SpringMVC的拦截器(Interceptor)也是AOP思想的一种实现方式。它与Servlet的过滤器(Filter)功能类似,主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
拦截器和过滤器的区别
- 拦截器是SpringMVC组件,而过滤器是Servlet组件。
- 拦截器不依赖Web容器,过滤器依赖Web容器。
- 拦截器只能对控制器请求起作用,而过滤器则可以对所有的请求起作用。
- 拦截器可以直接获取IOC容器中的对象,而过滤器就不太方便获取。
二、拦截器的使用
(1)控制器
(2)创建拦截器类
该类实现HandlerInterceptor接口,需要重写三个方法:
- preHandle:请求到达Controller前执行的方法,返回值为true通过拦截器,返回值为false被拦截器拦截。
- postHandle:跳转到JSP前执行的方法
- afterCompletion:跳转到JSP后执行的方法
public class Interceptor1 implements HandlerInterceptor { //请求到达controller前执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("到达controller前"); //返回值是false无法到达controller return true; } //跳转到jsp前执行,此时可以向request域请求数据 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("跳转到jsp前"); request.setAttribute("name","opopopop"); } //跳转到jsp后执行,此时不可向request域添加数据 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("跳转到jsp后"); request.setAttribute("age","9090"); } }
(3)jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h3>name=${requestScope.name}</h3> <h3>age=${requestScope.age}</h3> </body> </html>
(4)在SpringMvc核心配置文件中配置拦截器
<!-- 配置拦截器--> <mvc:interceptors> <mvc:interceptor> <!-- 配置拦截器的作用路径--> <mvc:mapping path="/**"/> <!-- 拦截器对象 --> <bean class="com.gq.MyInterceptor.Interceptor1"/> </mvc:interceptor> </mvc:interceptors>
三、全局拦截器
全局拦截器可以拦截所有控制器处理的URL,作用等于/**,其实就跟上面的一样,只不过这个写的更简单吧,配置方式如下:
<!-- 配置拦截器 --> <mvc:interceptors> <!-- 全局拦截器 --> <bean class="com.itbaizhan.interceptor.MyInterceptor"> </bean> </mvc:interceptors>
四、拦截器案例
将敏感词换成***
// 敏感词拦截器 public class SensitiveWordInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { // 敏感词列表 String[] sensitiveWords = {"坏人","暴力","笨蛋"}; // 获取model中所有数据 Map<String, Object> model = modelAndView.getModel(); Set<Map.Entry<String, Object>> entries = model.entrySet(); // 遍历model for (Map.Entry<String, Object> entry : entries) { String key = entry.getKey(); String value = entry.getValue().toString(); // 将model值和敏感词列表遍历比对 for (String sensitiveWord : sensitiveWords) { // 如果model值包含敏感词,则替换 if(value.contains(sensitiveWord)){ String newStr = value.replaceAll(sensitiveWord, "***"); model.put(key, newStr); } } } } }