Spring Boot 拦截器
一般在做登录功能时,我们都需要使用拦截器做登录拦截,这里记录下在Spring Boot中做拦截器的过程和注意;
第一步:首先我们先要实现一个HandlerInterceptor接口来实现拦截器功能
public class LoginHandlerInterceptor implements HandlerInterceptor { /** * 在访问Controller之前做检测 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object username = request.getSession().getAttribute("username"); // 用户未登录,跳转到用户界面,要求用户登录 if (username==null) { request.setAttribute("error", "请先登录后才能使用!"); request.getRequestDispatcher("/login").forward(request, response); //response.sendRedirect("/login"); 这个也可以使用,但是不能传递参数 return false; } // 用户已经登录,放行请求 return true; } }
第二步:在Spring Boot中,我们需要注册我们的拦截器到容器中,
这里是实现WebMvcConfigure接口,方便我们自行扩展Spring Boot对Spring MVC的组件支持,实现addInterceptors方法就是用于注册我们的拦截器组件到容器中;
@Configuration // @EnableWebMvc 这个注解会让spring boot的MVC相关的自动配置全部失效 public class DefineMvcConfig implements WebMvcConfigurer { // 配置拦截器 addPathPatterns(url):配置拦截的请求 excludePathPatterns(urls...):配置放行的请求 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**") .excludePathPatterns("/", "/login", "/user/login"); } }
上面就是Spring Boot实现一个拦截器,但是处理运行项目后,访问页面出现了样式问题(没有配置拦截器之前是没有问题的)
原因:SpringBoot2.x版本,配置自定义的拦截器之后,会导致对静态资源的访问处理失效,于是需要配置静态资源访问请求放行
因为我的项目引入静态资源有两处,一处是webjar引入,一处是从static文件夹下引入,于是添加了如下两个放行:
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**") .excludePathPatterns("/", "/login", "/user/login", "/webjars/**", "/static/**");
再次访问,样式还是部分存在问题,引入 webjar 的静态资源生效了,但引入static的静态资源依然会被拦截
在网上查了很多方法,尝试下来都没有解决,最终有一种方式生效了,先记录下来,至于为什么,我也还没有弄清楚,之后再细看下
完整的拦截器配置如下:把/**都改为/*,就可以让static下文件直接被访问(不会被拦截)
// 配置拦截器后,SpringBoot2.x需要对静态资源也要做放行处理 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/*") .excludePathPatterns("/", "/login", "/user/login", "/webjars/*"); }
这里,提醒大家注意浏览器页面缓存,我配置拦截器后,没有对static静态资源进行处理,结果请求页面居然是可以的,
于是就继续下一步,不久后请求居然出现样式问题,又到头来解决staitc资源拦截问题。
页面缓存解决:使用谷歌Chrome测试页面时,可以打开无痕窗口来进行测试,虽然测试时每次都需要输入(没有记录),但是可以有效避免浏览器页面缓存带来的问题