为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕村9548890 2019-02-17 17:26:20
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,第二次有值
查看完整描述

6 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-03-01
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

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

查看完整回答
反对 回复 2019-03-01
?
波斯汪

TA贡献1811条经验 获得超4个赞

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

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

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

查看完整回答
反对 回复 2019-03-01
?
HUX布斯

TA贡献1876条经验 获得超6个赞

和浏览器没关系的,也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;
查看完整回答
反对 回复 2019-03-01
?
慕斯王

TA贡献1864条经验 获得超2个赞

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

查看完整回答
反对 回复 2019-03-01
  • 6 回答
  • 0 关注
  • 4075 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信