springboot拦截器不拦截静态资源,只拦截controller的实现方法
作者:cying2029
springboot拦截器不拦截静态资源,只拦截controller
拦截器拦截静态资源问题
实现拦截器的做法就是实现HandlerInterceptor
然后再WebMvcConfigurer
里配置拦截器
这个时候,一般要手动添加过滤的静态资源路径,如果静态资源路径修改,则拦截器要修改
如果有添加其他拦截/**的拦截器,也需要配置静过滤态资源路径
@Configuration public class WebConfigurer implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { String []strs = {"/static/**","/project/**","/assets/**","/login","/login.do"}; registry.addInterceptor(loginInterceptor).excludePathPatterns(strs); } }
只拦截controller方法
利用HandlerInterceptor 接口的handler
如果是controller的方法,handler为 HandlerMethod
如果是资源类,handler为 org.springframework.web.servlet.resource.ResourceHttpRequestHandler
public interface HandlerInterceptor { default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } ...
实现
加一层抽象类,新增的拦截器继承该抽象类,并在controllerMethodPreHandle
方法实现业务功能,即可忽视静态资源类
public abstract class AbstrctControllerInterceptor implements HandlerInterceptor { protected abstract boolean controllerMethodPreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException; @Override public final boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //如果是controller的方法handler为HandlerMethod //如果是资源类则handler为org.springframework.web.servlet.resource.ResourceHttpRequestHandler if(handler instanceof HandlerMethod){ return controllerMethodPreHandle(request,response,handler); } //否则不拦截 return true; } }
登录拦截器实现
@Component public class LoginInterceptor extends AbstrctControllerInterceptor { @Override protected boolean controllerMethodPreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { Object user = request.getSession().getAttribute(ConstantValue.USER_CONTEXT_KEY); if(user == null){ response.sendRedirect("/login"); return false; } return true; } }
对比之前的配置,可以忽视资源路径了
@Configuration public class WebConfigurer implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // String []strs = {"/static/**","/project/**","/assets/**","/login","/login.do"}; String []strs = {"/login","/login.do"}; registry.addInterceptor(loginInterceptor).excludePathPatterns(strs); } }
springboot拦截器问题
Spring Boot 拦截器是 AOP 的一种实现,专门拦截对控制层的请求,主要应用于判断用户权限,拦截webSocket请求。
在 Spring Boot 项目中,使用拦截器功能通常需要以下 2 步:
- 1.创建拦截器;
- 2.配置拦截器,指定拦截规则(如果是拦截所有,静态资源也会被拦截)。
第一步:创建拦截器
创建的类实现 HandlerInterceptor 接口,即可成为拦截器类
HandlerInterceptor 接口中定义以下 3 个方法,如下表所示。
实例:
/** * 自定义拦截器类 */ public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口 /** * 访问控制器方法前执行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(new Date() + "--preHandle:" + request.getRequestURL()); return true; } /** * 访问控制器方法后执行 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(new Date() + "--postHandle:" + request.getRequestURL()); } /** * postHandle方法执行完成后执行,一般用于释放资源 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL()); } }
注意:MyInterceptor 中的方法执行顺序为 preHandle – Controller 方法 – postHandle – afterCompletion ,所以拦截器实际上可以对 Controller 方法执行前后进行拦截监控。
第二步:配置拦截器
/** * Web配置类 */ @Configuration public class WebConfig implements WebMvcConfigurer { /** * 添加Web项目的拦截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { // 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截 registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") .excludePathPatterns("/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**"); //放行登录页,登陆操作,静态资源 } }
在指定拦截器拦截规则时,调用了两个方法,这两个方法的说明如下:
- addPathPatterns:该方法用于指定拦截路径,例如拦截路径为“/**”,表示拦截所有请求,包括对静态资源的请求。
- excludePathPatterns:该方法用于排除拦截路径,即指定不需要被拦截器拦截的请求。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- springboot设置加载静态资源的路径(spring.resources.static-locations)
- SpringBoot中的static静态资源访问、参数配置、代码自定义访问规则详解
- 关于SpringBoot拦截器拦截静态资源的问题
- springboot应用中静态资源访问与接口请求冲突问题解决
- SpringBoot2.x过后static下的静态资源无法访问的问题
- SpringBoot如何访问html和js等静态资源配置
- springboot+thymeleaf打包成jar后找不到静态资源的坑及解决
- SpringBoot无法访问/static下静态资源的解决
- SpringBoot静态资源及原理解析