介绍:
在企业开发中无论是大的项目还是小的项目,所以的web接口都可能会遇到需要进行权限验证/登陆验证/授权认证的拦截。我常用的做法就是将登陆信息/权限信息存入redis,前端返回token,每次请求时进行验签;在进行验签时需要通过redis组件进行操作redis缓存,因为其他地方也用到这个redis组织所以我将他注入到了spring容器中,但是到请求拦截发现获取不到这个redis组件,下面记录一下解决方式留做笔记。
转载部分:
拦截器部分
public class WebHandlerInterceptor implements HandlerInterceptor {
Logger logger = LoggerFactory.getLogger(WebHandlerInterceptor.class);
@Autowired
IRedisService redisService;
/**
* controller 执行之前调用
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//请求拦截器
logger.info("-------------------------请求拦截器-------------------------");
String path = request.getServletPath();
logger.info(path);
/* if(path !=null && path.contains("/login")){
logger.info("-------------------------不拦截-------------------------");
return true;
}*/
String key = CookieUtil.getCookie(request);
if(key == null){
logger.info("-------------------------key为null-------------------------");
response.setStatus(601);
return false;
}
String value =redisService.get(key);
if(value == null){
logger.info("-------------------------value为null-------------------------");
response.setStatus(601);
return false;
}
logger.info("-------------------------登陆认证通过-------------------------");
return true;
}
/**
* controller 执行之后,且页面渲染之前调用
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//请求响应拦截器
logger.info("-------------------------请求响应拦截器-------------------------");
}
/**
* 页面渲染之后调用,一般用于资源清理操作
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//页面渲染拦截器
logger.info("-------------------------页面渲染拦截器-------------------------");
}
}
拦截器注入部分
@Configuration public class WebConfig extends WebMvcConfigurerAdapter { private WebHandlerInterceptor webHandlerInterceptor = new WebHandlerInterceptor(); /** * 注入拦截器bean */ @Bean WebHandlerInterceptor webHandlerInterceptor(){ return webHandlerInterceptor; } /** * 注册 拦截器 * .addPathPatterns("/seengene/**") 添加拦截路径 * .excludePathPatterns("/seengene/login") 添加拦截排除路径 */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(webHandlerInterceptor).excludePathPatterns("/app/login"); } }
原创:获取拦截器实例化对象 并将实例化对象注入到容器中,这个方式既能继续使用拦截器
addInterceptors的重写进行拦截规则设置,又能在拦截层进行bean装配。