springcloud zuul 路由,拦截过滤请求,前后端分离,session不一致问题

前后端分离,后端需要验证用户登录之后才放行,允许请求服务接口。

测试中发现有些接口正常,有些接口发到后台的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";// 前置过滤器
    }

}

你可能感兴趣的:(springboot,springcloud,zuul)