问题
在filter实现类这里注入的redisUtil 但是 拿到的却是 null
public class SecurityFilter implements Filter {
@Autowired
RedisUtil redisUtil;
web应用启动的顺序是:listener->filter->servlet,先初始化listener,然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。
所以需要创建filter的时候 需要@Bean初始化一下
然后返回查看注册Filter看下 发现 问题出现在 没有 在@Bean这样去创建返回对象
@Bean
public SecurityFilter securityFilter() {
return new SecurityFilter();
}
可以正常注入的Filter
注册Filter
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean FilterRegistrationBean2(){
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
//将filter注入进去
filterFilterRegistrationBean.setFilter(securityFilter());
//需要过滤的网址
filterFilterRegistrationBean.addUrlPatterns(
"/OTApply/*");
//设置filter的等级
filterFilterRegistrationBean.setOrder(Ordered.LOWEST_PRECEDENCE);
//设置filter的名字
filterFilterRegistrationBean.setName("tokenFilter");
return filterFilterRegistrationBean;
}
//注意上面 不能直接new 一个filter 一定要通过这种方式 来返回对象 要不然不能注入到spring boot里面
@Bean
public SecurityFilter securityFilter() {
return new SecurityFilter();
}
}
Filter实现类
@Slf4j
public class SecurityFilter implements Filter {
@Autowired
RedisUtil redisUtil;
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
String token = httpServletRequest.getHeader("token");
System.out.println(token+"从header那里获取token");
String requestURL = httpServletRequest.getRequestURL().toString();
String method = httpServletRequest.getMethod();
System.out.println(method);
System.out.println(requestURL+"requestURL");
String path = requestURL.substring(requestURL.lastIndexOf("/") + 1);
//如果token是空的就返回去 并告知登录后再进行操作
if (token == null || token.equals("null")) {
error(httpServletResponse, HttpStatus.UNAUTHORIZED.value(), "请登陆后再进行操作");
return;
}
UserVO userVO = null;
try {
userVO = (UserVO) redisUtil.get(token);
}catch (Exception e) {}
if (null == userVO) {
error(httpServletResponse, HttpStatus.UNAUTHORIZED.value(), "token失效");
}
//每在这个网页上操作都会重置redis的过期时间
redisUtil.set(token, userVO, Constants.EXPIRE_TIME);
//若上面运行都不出差错 就会继续执行下去
chain.doFilter(servletRequest, servletResponse);
}
private void error(HttpServletResponse httpServletResponse, int status, String message) {
httpServletResponse.setContentType("application/json;charset=utf-8");
httpServletResponse.setStatus(status);
PrintWriter writer = null;
try {
writer = httpServletResponse.getWriter();
writer.write(JsonUtil.toJsonString(Result.withMessage(message)));
} catch (IOException e) {} finally {
writer.close();
}
}