一、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 {
@Override
public boolean preHandle(HttpServletRequest request,
HttpSession session = request.getSession();
Object roleid = session.getAttribute("roleid");
String requestURI = request.getRequestURI();
if (roleid != null) {
ArrayList data = (ArrayList<Object>) 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;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
//后置拦截器,删除一些预置信息,避免内存泄露
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserThreadLocal.removeUser();
}
五、拦截程序中接口,进入HandlerInterceptor实现类
@Configuration
public class MenuUnauthorizedConfig implements WebMvcConfigurer {
@Autowired
MenuUnauthorizedInterceptor menuUnauthorizedInterceptor;
/**
* 添加Web项目的拦截器
*/
@Override
public 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的路径开始配置即可。