springboot的过滤器一次请求执行了两次,且在第一次获取的某header为空的情况下第二次过滤可以获取header

1.如题,一次过来的请求在loginfilter里执行了两次,第一次获取header为空,然后又进入了一次loginfilter,却可以获得header的一个参数

2.filter类

public class LoginFilter implements Filter {

    @Autowired
    UserService userService;

    @Value("errorPage")
    String errorPage = "/auth/error.htm";

    //Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        ServletContext servletContext = filterConfig.getServletContext();
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        userService = (UserService)ctx.getBean("userService");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {
        String path = ((HttpServletRequest)servletRequest).getServletPath();
        String tempUid = ((HttpServletRequest)servletRequest).getHeader("tempUid");
        //System.out.println(JSON.toJSONString(req.getHeaderNames()));
        //logger.info("path=" + path + " and tempUid = " + tempUid);
        if (path.indexOf("/auth/configValue") >= 0 ||
            path.indexOf("/user/code") >= 0) {
            // Filter 只是链式处理,请求依然转发到目的地址。
            filterChain.doFilter(servletRequest, servletResponse);
        } else if (StringUtils.hasLength(tempUid)){
            userService.checkAuth(tempUid);
            // Filter 只是链式处理,请求依然转发到目的地址。
            filterChain.doFilter(servletRequest, servletResponse);
        } else if (path.indexOf(errorPage) >= 0){
            // Filter 只是链式处理,请求依然转发到目的地址。
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //logger.error("除获取前端签名和用户信息,所有接口都必须带tempUid!");
            //return;
            servletRequest.getRequestDispatcher(errorPage).forward(servletRequest, servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

//filter配置
@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean filterRegistration() {

        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new LoginFilter());
        registration.addUrlPatterns("/*");
        registration.setName("loginFilter");
        registration.setOrder(1);
        return registration;
    }

}

3.请求进来的时候第一次获取tempUid为null,第二次有值

阅读 14.6k
7 个回答

开发者工具+debug看一下是怎么回事?

后台必然debug了,这是一个移动端h5项目,调用也不在我这里,而且前端明确表示他只发了一次请求。目前看来好像filter被加载了两次,但是最奇怪的是header里的属性两次却不一样

前端是浏览器吗?浏览器一个请求会发送多次

是post请求?get会出现此问题吗?

注意post会发送俩次tcp连接(浏览器先发送header,服务器响应100,再发送data,服务器响应200)

registration.addUrlPatterns("/login/*"); // 改成这个呢?

和浏览器没关系的,也urlPatterns也没关系。。。我也没解决,还在坑中--SpringBoot2.0

    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(new DelegatingFilterProxy("sysVisitFilter"));
    registrationBean.addInitParameter("targetFilterLifecycle","true");
    registrationBean.addUrlPatterns("/*");
    registrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico");
    registrationBean.setDispatcherTypes(DispatcherType.REQUEST);
    return registrationBean;

跨域问题吗?第一次是不是预检请求啊?请求类型OPTIONS?

新手上路,请多包涵

第一次请求类型是OPTIONS

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题