猿问

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,第二次有值

慕村9548890
浏览 4076回答 6
6回答

MYYA

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

蝴蝶刀刀

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

波斯汪

是post请求?get会出现此问题吗? 注意post会发送俩次tcp连接(浏览器先发送header,服务器响应100,再发送data,服务器响应200) registration.addUrlPatterns("/login/*"); // 改成这个呢?

HUX布斯

和浏览器没关系的,也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?
随时随地看视频慕课网APP

相关分类

Java
我要回答