1.問題描述:
最近自己在寫demo時遇到一個問題,在ajax請求時用Filter做登錄攔截,結果頁面不跳轉(Ajax是不能做轉發和重定向的)、、、、
最終的最終在同事zt的提示下,恍然大悟,雖然很基本的問題,但也糾結了好久,只能說太菜,記錄下來,以免以后再犯。
2.解決辦法:
在doFilter方法中判斷是否為Ajax請求,做進一步處理
代碼如下:
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
HttpServletResponse resp=(HttpServletResponse) response;
HttpServletRequest req=(HttpServletRequest) request;
String url = req.getRequestURI();
System.out.println(url);
HttpSession session = ((HttpServletRequest) request).getSession();
String path = req.getContextPath();
String basePath= req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+path+"/";
basePath=basePath+"rest/userManager/loginOut";
try {
// 過濾掉登陸和退出請求
if ((url.indexOf("/ddoa/rest/userManager/login") >= 0)|| (url.indexOf("/ddoa/rest/userManager/loginOut") >= 0)) {
chain.doFilter(request, response);
} else {
if (null != session) {
Map map = (Map) session.getAttribute("userMap");
if(null!=map){
chain.doFilter(request, response);
}else{
//1:判斷是否是ajax請求
if (req.getHeader("x-requested-with") != null&& "XMLHttpRequest".equalsIgnoreCase(req.getHeader("x-requested-with"))) {
//向http頭添加 狀態 sessionstatus
resp.setHeader("sessionstatus","timeout");
resp.setStatus(403);
//向http頭添加登錄的url
resp.addHeader("loginPath", basePath);
chain.doFilter(request, response);
return ;
}else{
resp.sendRedirect(basePath);
}
}
} else {
//1:判斷是否是ajax請求
if (req.getHeader("x-requested-with") != null&& "XMLHttpRequest".equalsIgnoreCase(req.getHeader("x-requested-with"))) {
//向http頭添加 狀態 sessionstatus
resp.setHeader("sessionstatus","timeout");
resp.setStatus(403);
//向http頭添加登錄的url
resp.addHeader("loginPath", basePath);
chain.doFilter(request, response);
return ;
}else{
resp.sendRedirect(basePath);
}
}
}
} catch (IOException | ServletException e) {
e.printStackTrace();
}
}