前后端分离,后端需要验证用户登录之后才放行,允许请求服务接口。
测试中发现有些接口正常,有些接口发到后台的sessionId不一样,导致无法获取到数据。
排查后发现,这些请求发请求之前会先发一次options请求,然后才发get/post的请求获取数据。
然后options请求的sessionId是新的,后台直接拦截了,造成没有继续发送请求,获取不到数据。
解决方案,在过滤请求之前,先对options请求做一下处理。
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
return null;
}
贴上filter代码
@Component
public class UserLoginFilter extends ZuulFilter {
private static final Logger LOG = LoggerFactory.getLogger(UserLoginFilter.class);
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
HttpSession session = request.getSession();
String url = request.getRequestURL().toString();
LOG.info(String.format("%s UserLoginFilter request to %s", request.getMethod(), url));
String username = (String) session.getAttribute(UserSessionMap.USERNAME_KEY);
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
return null;
}
if (StringUtils.isBlank(username)) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody("{\"status\":401,\"msg\":\"user is not login !\"}");
ctx.getResponse().setContentType("text/html;charset=UTF-8");
}
ctx.addZuulRequestHeader("username", username);
return null;
}
@Override
public boolean shouldFilter() {
return true;// 是否执行该过滤器,此处为true,说明需要过滤
}
@Override
public int filterOrder() {
return 0;// 优先级为0,数字越大,优先级越低
}
@Override
public String filterType() {
return "pre";// 前置过滤器
}
}
MARK:
最近在关注一个手机挖矿项目,叫Bee蜜蜂币。
APP 下载链接: https://bee.com/sc/
推荐码:lei911gang
手机免费挖矿,感兴趣的可以一起加入。