赞
踩
Java中的拦截器是动态拦截 action 调用的对象,然后提供了可以在 action 执行前后增加一些操作,也可以在 action执行前停止操作,功能与过滤器类似,但是标准和实现方式不同。
我们需要实现 HandlerInterceptor 类,并且重写三个方法
1. 定义login的拦截器
public class LoginInterceptor implements HandlerInterceptor { /** * 进入controller方法之前 * * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("LoginInterceptor ==》进入preHandle"); //进入controller之前验证token的值 String token = request.getParameter("token"); System.out.println(request.getRequestURL()); //验证用户登录 Object user = request.getSession().getAttribute("user"); if (user != null) { return true; } else { System.out.println("用户未登录..."); // request.getRequestDispatcher("/index.html").forward(request, response); // response.sendRedirect(request.getContextPath()+"login.html"); response.sendRedirect("/login.html"); return false; } /* response.getWriter().print("失败!"); return HandlerInterceptor.super.preHandle(request, response, handler); */ } /** * 调用完controller,视图渲染之前 * * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("LoginInterceptor ==》postHandle"); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } /** * 整个完成后,通常用于资源清理 * * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("LoginInterceptor ==》afterCompletion"); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
2. 注册刚才加的LoginInterceptor,并制定拦截的路径
注解拦截器注意的地方。要么是类上面没加注解,要么就是拦截的路径设置的有问题
拦截的路径一般子在结尾的时候加** 表示所有的。/是匹配子文件夹
拦截所有可以配置为/*
@Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //拦截的路径一般子在结尾的时候加** 表示所有的。/*是匹配子文件夹 //拦截所有可以配置为/** registry.addInterceptor(new LoginInterceptor()) //制定拦截的路径 .addPathPatterns("/api/*/**") //添加不拦截的路径 .excludePathPatterns("/login", "/css/**", "/images/**", "/js/**", "/login.html"); WebMvcConfigurer.super.addInterceptors(registry); } }
3. controller的测试方法
@RequestMapping("/api/test/testLoginInterceptor")
public Object testLoginInterceptor() {
Map map = new HashMap();
map.put("test","我的拦截器");
return map;
}
1、@Configuration
继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本)
SpringBoot2.X 新版本配置拦截器 implements WebMvcConfigurer
2、自定义拦截器 HandlerInterceptor
preHandle:调用Controller某个方法之前
postHandle:Controller之后调用,视图渲染之前,如果控制器Controller出现了异常,则不会执行此方法
afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理
3、按照注册顺序进行拦截,先注册,先被拦截
拦截器不生效常见问题:
1)是否有加@Configuration
2)拦截路径是否有问题 ** 和 *
3)拦截器最后路径一定要 “/**”, 如果是目录的话则是 /*/
过滤前->拦截前->action执行->拦截后->过滤后
参考博客:https://www.cnblogs.com/wangjunwei/p/11421343.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。