如题
在LoginFilter中不能直接使用@autowired注解,我一开始试了在LoginFilter上加@Component,但是过滤器就失效了(不算完全失效吧,if里面即直接放行的语句能走,比如log能打印出来,但是需要拦截的请求就出问题了,发送请求没有反应)
后面我又试了通过构造函数注入:在 LoginFilter 类中添加构造函数,并在 FilterConfig 类中通过构造函数传递 StringRedisTemplate,我看黑马的视频里面拦截器就是这样注入的但是还是出现了和上面一样的问题
以下是我过滤器代码
@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginFilter implements Filter {
StringRedisTemplate stringRedisTemplate;
public LoginFilter(StringRedisTemplate stringRedisTemplate){
this.stringRedisTemplate = stringRedisTemplate;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//获取url
HttpServletRequest hsreq = (HttpServletRequest) servletRequest;
HttpServletResponse hsres = (HttpServletResponse) servletResponse;
String s = hsreq.getRequestURL().toString();
String jwt = hsreq.getHeader("token");
log.info("拦截到请求:{}", s);
//检验是否是对用户的操作
if ((!s.contains("user")) && (!s.contains("cart"))) {
filterChain.doFilter(servletRequest, servletResponse);
log.info("运行if内代码");
return;
}
//检验jwt令牌
if (jwt == null || jwt.equals("")) {
Result r = Result.error("NOT LOGIN");
String err = JSONObject.toJSONString(r);
servletResponse.getWriter().write(err);
return;
}
try {
JwtUtils.parseJwt(jwt);
} catch (Exception e) {
e.printStackTrace();
Result r = Result.error("NOT LOGIN");
String err = JSONObject.toJSONString(r);
servletResponse.getWriter().write(err);
return;
}
boolean b = Boolean.TRUE.equals(stringRedisTemplate.expire("syf:token:" + jwt, 30L, java.util.concurrent.TimeUnit.MINUTES));
if (b)
log.info("刷新token成功");
filterChain.doFilter(servletRequest, servletResponse);
}
}
这是配置文件
@Configuration
public class FilterConfig {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Bean
public FilterRegistrationBean<LoginFilter> loginFilter() {
FilterRegistrationBean<LoginFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new LoginFilter(stringRedisTemplate));
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
以下是前端页面的报错信息
Access to XMLHttpRequest at 'http://localhost:8080/user' from origin 'http://localhost:5173' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.