最近写的一个servlet过滤器,用于拦截请求,判断用户是否登录。
写好后发现一个问题,当我直接在浏览器地址栏里输入地址,可以跳转页面;当点击按钮时,过滤器代码正常执行,但是页面没有跳转;是因为按钮都是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;
-
}
-
}
-
}
上面是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");
-
}
-
}
-
});
上面是js代码,找个公共的js,里面加入ajaxSetup方法,具体看注释。
以上,就是解决ajax请求过滤器重定向不跳转的问题。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013997090/article/details/77338508
AJAX请求 $.ajaxSetup方法的使用
jQuery.ajaxSetup()
函数用于设置AJAX的全局默认设置。
该函数用于更改jQuery中AJAX请求的默认设置选项。之后执行的所有AJAX请求,如果对应的选项参数没有设置,将使用更改后的默认设置。
该函数属于全局jQuery
对象。
语法
jQuery 1.1 新增该静态函数。
jQuery.ajaxSetup( settings )
参数
参数 | 描述 |
---|---|
settings | Object类型一个对象,其中的每个属性表示需要更改默认设置的选项,属性值表示更改后的默认值。 |
关于settings
参数可以识别的属性,请参考jQuery.ajax()
中的settings参数说明。其中的所有选项参数都是可选设置的。
返回值
jQuery.ajaxSetup()
函数没有返回值,或者说其返回值为undefined
。
示例&说明
以下是与jQuery.ajaxSetup()
函数相关的jQuery示例代码,以演示jQuery.ajaxSetup()
函数的具体用法:
-
//设置AJAX的全局默认选项
-
$.ajaxSetup( {
-
url: "/index.html" , // 默认URL
-
aysnc: false , // 默认同步加载
-
type: "POST" , // 默认使用POST方式
-
headers: { // 默认添加请求头
-
"Author": "CodePlayer" ,
-
"Powered-By": "CodePlayer"
-
} ,
-
error: function(jqXHR, textStatus, errorMsg){ // 出错时默认的处理函数
-
// jqXHR 是经过jQuery封装的XMLHttpRequest对象
-
// textStatus 可能为: null、"timeout"、"error"、"abort"或"parsererror"
-
// errorMsg 可能为: "Not Found"、"Internal Server Error"等
-
// 提示形如:发送AJAX请求到"/index.html"时出错[404]:Not Found
-
alert( '发送AJAX请求到"' + this.url + '"时出错[' + jqXHR.status + ']:' + errorMsg );
-
}
-
} );
-
// 未设置任何参数,但url、async、type、headers、error等参数的默认值均已被$.ajaxSetup()更改(如上)
-
$.ajax( );
-
// 设置了url、type、success、error,就使用自己设置的参数值
-
// 但async、headers等参数的默认值已被$.ajaxSetup()更改
-
$.ajax( {
-
url: "myurl.php?action=list" ,
-
type: "GET" ,
-
success: function( data, textStatus, jqXHR ){
-
alert("返回数据:" + data);
-
} ,
-
error: function(jqXHR, textStatus, errorMsg){
-
alert("自己的error!");
-
}
-
});
-
// 上述$.ajaxSetup()的默认设置对$.get()、$.post()、load()、$.getJSON()、$.getScript()等AJAX函数也生效
-
// 因为这些函数也是在内部调用$.ajax()函数来实现的,只不过它们在内部都设置了一些参数
-
// $.get()在内部调用$.ajax()时已设置type为"GET",因此仍然使用GET方式。
-
// 但url、async、headers、error等参数的默认值已被$.ajaxSetup()更改
-
$.get( );
-
// $.post()在内部调用$.ajax()时已设置type为"POST",因此仍然使用POST方式。
-
// url也被设置为"user/action.php?method=addUser"
-
// 但async、headers、error等参数的默认值已被$.ajaxSetup()更改
-
$.post( "user/action.php?method=addUser" );