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里的属性两次却不一样
波斯汪
TA贡献1811条经验 获得超4个赞
是post请求?get会出现此问题吗?
注意post会发送俩次tcp连接(浏览器先发送header,服务器响应100,再发送data,服务器响应200)
registration.addUrlPatterns("/login/*"); // 改成这个呢?
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;
添加回答
举报
0/150
提交
取消