背景
为增加系统安全性,对每个请求需要进行鉴权,过滤掉非法请求。
基于Spring拦截器实现。鉴权通过时可通过ThreadLocal存储一些用户信息,方便之后业务使用。
定义ThreadLocal对象
@Component
public class CodeHolder {
private static ThreadLocal<String> agentCodes = new ThreadLocal<String>();
public void setAgentCode(String appid){
agentCodes.set(appid);
}
public String getAgentCode(){
return agentCodes.get();
}
public void clear(){
agentCodes.remove();
}
}
定义拦截器
@Component
public class AuthorityInterceptor implements HandlerInterceptor {
@Autowired
private CodeHolder codeHolder;
/**
* 预处理回调方法,实现处理器的预处理(如检查登陆),第三个参数为响应的处理器,自定义Controller
* 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String appId = request.getHeader("APPID");
if(appId == null || appId.equals("")){
log.error("AppId为空");
response.setStatus(403);
return false;
}else{
codeHolder.setAgentCode(appId);
return true;
}
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("请求完成后,清空ThreadLocal");
codeHolder.clear();
}
}
添加拦截器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private AuthorityInterceptor authorityInterceptor ;
//配置拦截器 可以添加多个拦截器 注意理解多个拦截器拦截顺序
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authorityInterceptor );
}
}
鉴权结果示例
ERROR c.c.springboottest.interceptor.PassportInterceptor - AppId为空