spring boot 项目在拦截器Interceptor中 注入RedisUtil,RedisUtil无法使用的问题(RedisUtil报null错误)
这是最初的代码。提示RedisUtil为null
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Resource
RedisUtil redisUtil;
@Override //ctrl+o重写方法快捷键
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//ctrl+alt+v生成对应类型
Object sessionId = request.getHeader("sessionId");
String sessionIdRedis = redisUtil.getString("sessionId");
if (sessionId != null && sessionId.toString().equals(sessionIdRedis)) {
System.out.println("验证sessId的值");
return true;
}
throw new BadException(BaseResultCode.INTERNAL_SERVER_ERROR, "请重新登录");
}
}
原因:拦截器在SpringContext初始化之前就执行了,Bean初始化之前它就执行了,所以它肯定是无法获取SpringIOC容器中的内容的。
修改之后的代码:
package com.wxf.controller;
import com.wxf.enums.BaseResultCode;
import com.wxf.exception.BadException;
import com.wxf.utils.RedisUtil;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Resource
RedisUtil redisUtil;
@Override //ctrl+o重写方法快捷键
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//ctrl+alt+v生成对应类型
Object sessionId = request.getHeader("sessionId");
if (redisUtil == null) {
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
redisUtil = wac.getBean(RedisUtil.class);
}
String sessionIdRedis = redisUtil.getString("sessionId");
if (sessionId != null && sessionId.toString().equals(sessionIdRedis)) {
System.out.println("验证sessId的值");
return true;
}
throw new BadException(BaseResultCode.INTERNAL_SERVER_ERROR, "请重新登录");
}
}
扩展:
Interceptor是什么?
拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。
Interceptor可以做什么?
日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV(Page View)等
权限检查:如登录检测,进入处理器检测是否登录
性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录)
通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现。