Ajax請求如何用Filter重定向

其實蠻簡單的,網上資料也多,就是工作中遇到了,記錄一下。

現在比較流行的開發方式,不管前端是APP、網頁、小程式,後端是微服務、分散式,涉及到登入登出,使用者資訊方面,多是基於JWT的Token方式,後端根據業務情況使用Filter或者Interceptor,採用純解密JWT或基於快取(本地、Redis等)等方案來進行整個生命週期的管理。

這裡過來的HTTP請求基本上都是Ajax請求。

不過在很多ToB專案、老系統中,基於Session的使用者資訊管理,HTTP請求中,頁面、Ajax請求混雜。

我這兩天就遇到了這個情況:

1、要用Filter針對幾個請求做處理。

2、不符合要求的必須重定向到另一個服務提供的介面。

3、基本都是頁面請求,唯有一個是Ajax請求。

頁面請求的重定向比較簡單,

response。sendRedirect(URL);

或者

request。getRequestDispatcher(URL)。forward(request, response);

二者的區別就不再說了,很基礎的知識。

我遇到的問題就是,這是一個Ajax請求,而重定向的URL是個頁面,請求方必須跳轉到那個頁面進行後續操作。

這情況其實就很煩了,如果重定向的URL也是個介面,這事好辦了,服務端直接HTTP請求過去,拿到結果返回給請求方就行了。

如果請求方是個普通的頁面請求也方便了,重定向即可。

現在Ajax-服務端-重定向頁面,這種局面,就需要前後端同時改造。

後端Filter:

import java。io。IOException;import java。util。Objects;import javax。servlet。Filter;import javax。servlet。FilterChain;import javax。servlet。ServletException;import javax。servlet。ServletRequest;import javax。servlet。ServletResponse;import javax。servlet。http。HttpServletRequest;import javax。servlet。http。HttpServletResponse;public class DemoFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; String url = req。getServletPath(); // TODO 排除不需要過濾的請求// if (不需要過濾的請求) {// chain。doFilter(request, response);// } // Ajax請求 if (Objects。nonNull(req。getHeader(“X-Requested-With”)) && req。getHeader(“X-Requested-With”)。equals(“XMLHttpRequest”)) { // TODO 過濾邏輯 // 重定向 // 設定與前端約定好的狀態 resp。setStatus(401); // 設定與前端約定好的 是否跳轉標識,0不跳轉,1跳轉 resp。setIntHeader(“redirectFlag”, 1); resp。setHeader(“redirectUrl”, “重定向的URL”); resp。flushBuffer(); } else { // TODO 非Ajax請求的處理 } }}

前端就比較簡單了,接收到響應後,根據status、redirectFlag、redirectUrl進行相應處理即可。