最近寫的一個servlet過濾器,用於攔截請求,判斷用戶是否登陸。css
寫好後發現一個問題,當我直接在瀏覽器地址欄裏輸入地址,能夠跳轉頁面;當點擊按鈕時,過濾器代碼正常執行,可是頁面沒有跳轉;是由於按鈕都是ajax請求,默認ajax是不支持重定向的,由於ajax自己就是局部刷新,不會從新加載頁面的。因此須要在過濾器裏再加個ajax請求判斷,而後找個前臺公共js加一個方法。上代碼
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
String currentURL = request.getRequestURI();
String ctxPath = request.getContextPath();
//除掉項目名稱時訪問頁面當前路徑
String targetURL = currentURL.substring(ctxPath.length());
HttpSession session = request.getSession(false);
String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ ctxPath;
String type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");// XMLHttpRequest
if (currentURL.endsWith(".js") || currentURL.endsWith(".css") || currentURL.endsWith(".png") || currentURL.endsWith(".jpg")) {
//這裏表示若是是靜態文件,則進行正常的頁面跳轉
filterChain.doFilter(request, response);
return;
} else {
String url = targetURL.substring(targetURL.lastIndexOf('/'));
//對當前頁面進行判斷,若是當前頁面不爲登陸頁面
if(!(signin_page.equals(targetURL) || signin.equals(url))){
System.out.println("1---"+targetURL+"---ctxPath:"+ctxPath+"---currentURL:"+currentURL);
//在不爲登錄頁面時,再進行判斷,若是不是登錄頁面也沒有session則跳轉到登陸頁面
if(session == null || session.getAttribute("user") == null){
if (StringUtils.equals("XMLHttpRequest", type)) {
// 處理ajax請求
response.setHeader("REDIRECT", "REDIRECT");//告訴ajax這是重定向
response.setHeader("CONTEXTPATH", basePath+"/signin.html");//重定向地址
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}else{
response.sendRedirect(ctxPath+signin_page);
return;
}
}else{
//這裏表示正確,會去尋找下一個鏈,若是不存在,則進行正常的頁面跳轉
filterChain.doFilter(request, response);
return;
}
}else{
//這裏表示若是當前頁面是登錄頁面,跳轉到登錄頁面
filterChain.doFilter(request, response);
return;
}
}
} html
上面是java過濾器代碼,添加了對於ajax請求的判斷。
$.ajaxSetup( {
//設置ajax請求結束後的執行動做
complete : function(XMLHttpRequest, textStatus) {
// 經過XMLHttpRequest取得響應頭,REDIRECT
var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT說明後端想重定向
if (redirect == "REDIRECT") {
var win = window;
while (win != win.top){
win = win.top;
}
//將後端重定向的地址取出來,使用win.location.href去實現重定向的要求
win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");
}
}
}); java