解決ajax請求filter重定向失敗
阿新 • • 發佈:2019-01-08
參考引用方法
在新專案寫了一個filter,能攔截jsp,.action的請求,但是ajax的請求可以攔截不能實現重寫向登入頁面。這是一個bug呀!
參考以上引用的方法,解決了。
ajax重定向的問題。
預設ajax是不支援重定向的,因為ajax本身就是區域性重新整理,不重新載入頁面的。如果需要用到重定向可以通過以下方法:
第一步:filter
public class AgentLoginFilter extends HttpServlet implements Filter{ private static final Log log = LogFactory.getLog(AgentLoginFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest sRequest, ServletResponse sResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) sRequest; HttpServletResponse response = (HttpServletResponse) sResponse; HttpSession session = request.getSession(); String url=request.getServletPath(); String contextPath=request.getContextPath(); String type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");// XMLHttpRequest String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ contextPath + "/"; if(url.equals("")){ url+="/agent"; } boolean isHasLogin = AgentSessionHelper.getHasLogined(request.getSession()); if(!isHasLogin){ if((url.startsWith("/agent") && !url.startsWith("/agent/login/YSAgentLoginAction/login.action")) && !url.startsWith("/agent/agentLogin.jsp")){ if (StringUtils.equals("XMLHttpRequest", type)) { // 處理ajax請求 response.setHeader("SESSIONSTATUS", "TIMEOUT"); response.setHeader("CONTEXTPATH", basePath+"agent/agentLogin.jsp"); response.setStatus(HttpServletResponse.SC_FORBIDDEN); return; }else{ response.sendRedirect(contextPath+"/agent/agentLogin.jsp"); return; } } }else{ if(url.startsWith("/agent/agentLogin.jsp")){ response.sendRedirect(contextPath+"/agent/agentIndex.jsp"); return; } } filterChain.doFilter(sRequest, sResponse); } }
第二步:在公共js 中寫入
通過$.ajaxSetup()方法給ajax方法統一新增請求執行結束後,執行的操作。
$.ajaxSetup( { //設定ajax請求結束後的執行動作 complete : function(XMLHttpRequest, textStatus) { // 通過XMLHttpRequest取得響應頭,sessionstatus var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus"); if (sessionstatus == "TIMEOUT") { var win = window; while (win != win.top){ win = win.top; } win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH"); } } });