m0_72158620 2024-11-24 20:04 采纳率: 20%
浏览 17

springboot项目过滤器里怎么使用StringRedisTemplate

如题
在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.

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的问题在于如何在Spring Boot的过滤器中使用StringRedisTemplate。从你的问题描述来看,你在尝试通过构造函数注入的方式使用StringRedisTemplate,但是遇到了问题。在这种情况下,我建议你可以尝试使用Spring的@Autowired注解在类级别进行注入,而不是在构造函数中进行注入。

    你可以尝试以下修改:

    首先,将LoginFilter类中的StringRedisTemplate字段改为使用@Autowired注解进行注入:

    @Slf4j
    @WebFilter(urlPatterns = "/*")
    public class LoginFilter implements Filter {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            // ...你的代码...
        }
    }
    

    然后,在FilterConfig类中,不需要通过构造函数传递StringRedisTemplate,Spring会自动处理注入:

    @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;
        }
    }
    

    这样,Spring会在初始化LoginFilter时自动注入StringRedisTemplate。请确保你的Spring Boot应用已经正确配置了Redis,并且StringRedisTemplate可用。如果你仍然遇到问题,可能需要检查你的Spring Boot配置是否正确,包括Redis的配置。

    评论

报告相同问题?

问题事件

  • 修改了问题 11月24日
  • 创建了问题 11月24日