最近写的一个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