SpringBoot拦截器HandlerInterceptor
创始人
2024-04-30 10:30:19

一、HandlerInterceptor是什么?
Spring Boot 拦截器主要应用于登陆校验、权限验证、乱码解决,同样提供了拦截器功能。
二、使用方式
在项目中实现HandlerInterceptor接口开箱即用
三、HandlerInterceptor 中实现的方法

方法介绍
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。(返回true,false
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。 (无返回值
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。(无返回值

四、程序中使用


@Component
public class MenuUnauthorizedInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpSession session = request.getSession();Object roleid = session.getAttribute("roleid");String requestURI = request.getRequestURI();if (roleid != null) {ArrayList data = (ArrayList) session.getAttribute("interfaced");if (data != null && data.size() > 0) {if (data != null) {int i = 0;for (Object datum : data) {JSONObject json = (JSONObject) JSONObject.toJSON(datum);String interfaceurl = json.getString("interfaceurl");if (interfaceurl.equals(requestURI)) {i++;break;}}if (i == 0) {response.setStatus(500);return false;}}} else {response.setStatus(500);return false;}}}return true;}
}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}//后置拦截器,删除一些预置信息,避免内存泄露@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserThreadLocal.removeUser();} 

五、拦截程序中接口,进入HandlerInterceptor实现类

@Configuration
public class MenuUnauthorizedConfig implements WebMvcConfigurer {@AutowiredMenuUnauthorizedInterceptor menuUnauthorizedInterceptor;/*** 添加Web项目的拦截器*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 对所有访问路径,都通过MenuUnauthorizedInterceptor类型的拦截器进行拦截registry.addInterceptor(new MenuUnauthorizedInterceptor()).addPathPatterns("/**").excludePathPatterns("/login").excludePathPatterns("/index").excludePathPatterns("/logout").excludePathPatterns("/img/**").excludePathPatterns("/images/**").excludePathPatterns("/resources/**").excludePathPatterns("/business/**").excludePathPatterns("/static/", "/css/", "/image/", "/js/",    // 过滤不验证的路径"/scaptcha","/loadmain","/sysmenu/query/by/currentuser","/page/loadmain","/page/sysrole","/api/**","/relation/partner/api/query/by/partnerid/******","/relation/role/menu/query/by/roleid/******","/page/sysrole/**","/page/**","/syspartner/**","/assets/css/***", "/assets/font/***","/assets/js/css/modules/laydate/default/******","/assets/js/css/modules/layer/default/******","/assets/js/css/modules/****","/assets/img/***", "/assets/js/***","/assets/service/***", "/css/**","/css/partner/***", "/frame/**","/frame/css/***", "/frame/img/***","/frame/js/***", "/frame/less/***","/frame/plugin/***", "/js/**");}
}

在WebMvcConfigurer 方法中可以指定拦截规则
1、addPathPatterns:该方法用于指定拦截路径,例如拦截路径为“/**”,表示拦截所有请求,包括对静态资源的请求。
2、excludePathPatterns:该方法用于排除拦截路径,即指定不需要被拦截器拦截的请求。

六、拦截失败的原因
1、在拦截过程中如果发现过滤某些接口不走当前拦截器,发现不生效,原因如下
在这里插入图片描述
1.配置拦截器时,如果excludePathPatterns没有生效,可能是url配置有问题。
2.可以检查下application.yml或者application-dev.properties的context-path,或者其它类似的地方,配置拦截器的url不应该包含这些路径,只要从Controller的路径开始配置即可。

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...