1. 程式人生 > >springcloud zuul 路由,攔截過濾請求,前後端分離,session不一致問題

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";// 前置過濾器 } }