解决ajax请求过滤器重定向不跳转

最近写的一个servlet过滤器,用于拦截请求,判断用户是否登录。

写好后发现一个问题,当我直接在浏览器地址栏里输入地址,可以跳转页面;当点击按钮时,过滤器代码正常执行,但是页面没有跳转;是因为按钮都是ajax请求,默认ajax是不支持重定向的,因为ajax本身就是局部刷新,不会重新加载页面的。所以需要在过滤器里再加个ajax请求判断,然后找个前台公共js加一个方法。上代码

 

 
  1. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws ServletException, IOException {

  2. HttpServletRequest request = (HttpServletRequest)servletRequest;

  3. HttpServletResponse response = (HttpServletResponse)servletResponse;

  4. String currentURL = request.getRequestURI();

  5. String ctxPath = request.getContextPath();

  6. //除掉项目名称时访问页面当前路径

  7. String targetURL = currentURL.substring(ctxPath.length());

  8. HttpSession session = request.getSession(false);

  9. String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ ctxPath;

  10. String type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");// XMLHttpRequest

  11.  
  12. if (currentURL.endsWith(".js") || currentURL.endsWith(".css") || currentURL.endsWith(".png") || currentURL.endsWith(".jpg")) {

  13. //这里表示如果是静态文件,则进行正常的页面跳转

  14. filterChain.doFilter(request, response);

  15. return;

  16. } else {

  17. String url = targetURL.substring(targetURL.lastIndexOf('/'));

  18. //对当前页面进行判断,如果当前页面不为登录页面

  19. if(!(signin_page.equals(targetURL) || signin.equals(url))){

  20. System.out.println("1---"+targetURL+"---ctxPath:"+ctxPath+"---currentURL:"+currentURL);

  21. //在不为登陆页面时,再进行判断,如果不是登陆页面也没有session则跳转到登录页面

  22. if(session == null || session.getAttribute("user") == null){

  23. if (StringUtils.equals("XMLHttpRequest", type)) {

  24. // 处理ajax请求

  25. response.setHeader("REDIRECT", "REDIRECT");//告诉ajax这是重定向

 
  1. response.setHeader("CONTEXTPATH", basePath+"/signin.html");//重定向地址

  2. response.setStatus(HttpServletResponse.SC_FORBIDDEN);

  3. return;

  4. }else{

  5. response.sendRedirect(ctxPath+signin_page);

  6. return;

  7. }

  8. }else{

  9. //这里表示正确,会去寻找下一个链,如果不存在,则进行正常的页面跳转

  10. filterChain.doFilter(request, response);

  11. return;

  12. }

  13. }else{

  14. //这里表示如果当前页面是登陆页面,跳转到登陆页面

  15. filterChain.doFilter(request, response);

  16. return;

  17. }

  18. }

  19. }


上面是java过滤器代码,添加了对于ajax请求的判断。

 

 

 
  1. $.ajaxSetup( {

  2. //设置ajax请求结束后的执行动作

  3. complete : function(XMLHttpRequest, textStatus) {

  4. // 通过XMLHttpRequest取得响应头,REDIRECT

  5. var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT说明后端想重定向

  6. if (redirect == "REDIRECT") {

  7. var win = window;

  8. while (win != win.top){

  9. win = win.top;

  10. }

  11. //将后端重定向的地址取出来,使用win.location.href去实现重定向的要求

  12. win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");

  13. }

  14. }

  15. });


上面是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 )

 

参数

参数描述
settingsObject类型一个对象,其中的每个属性表示需要更改默认设置的选项,属性值表示更改后的默认值。

关于settings参数可以识别的属性,请参考jQuery.ajax()中的settings参数说明。其中的所有选项参数都是可选设置的。

返回值

jQuery.ajaxSetup()函数没有返回值,或者说其返回值为undefined

示例&说明

以下是与jQuery.ajaxSetup()函数相关的jQuery示例代码,以演示jQuery.ajaxSetup()函数的具体用法:

  1. //设置AJAX的全局默认选项

  2. $.ajaxSetup( {

  3. url: "/index.html" , // 默认URL

  4. aysnc: false , // 默认同步加载

  5. type: "POST" , // 默认使用POST方式

  6. headers: { // 默认添加请求头

  7. "Author": "CodePlayer" ,

  8. "Powered-By": "CodePlayer"

  9. } ,

  10. error: function(jqXHR, textStatus, errorMsg){ // 出错时默认的处理函数

  11. // jqXHR 是经过jQuery封装的XMLHttpRequest对象

  12. // textStatus 可能为: null、"timeout"、"error"、"abort"或"parsererror"

  13. // errorMsg 可能为: "Not Found"、"Internal Server Error"等

  14.  
  15. // 提示形如:发送AJAX请求到"/index.html"时出错[404]:Not Found

  16. alert( '发送AJAX请求到"' + this.url + '"时出错[' + jqXHR.status + ']:' + errorMsg );

  17. }

  18. } );

  19.  
  20.  
  21. // 未设置任何参数,但url、async、type、headers、error等参数的默认值均已被$.ajaxSetup()更改(如上)

  22. $.ajax( );

  23.  
  24.  
  25. // 设置了url、type、success、error,就使用自己设置的参数值

  26. // 但async、headers等参数的默认值已被$.ajaxSetup()更改

  27. $.ajax( {

  28. url: "myurl.php?action=list" ,

  29. type: "GET" ,

  30. success: function( data, textStatus, jqXHR ){

  31. alert("返回数据:" + data);

  32. } ,

  33. error: function(jqXHR, textStatus, errorMsg){

  34. alert("自己的error!");

  35. }

  36. });

  37.  
  38. // 上述$.ajaxSetup()的默认设置对$.get()、$.post()、load()、$.getJSON()、$.getScript()等AJAX函数也生效

  39. // 因为这些函数也是在内部调用$.ajax()函数来实现的,只不过它们在内部都设置了一些参数

  40.  
  41.  
  42. // $.get()在内部调用$.ajax()时已设置type为"GET",因此仍然使用GET方式。

  43. // 但url、async、headers、error等参数的默认值已被$.ajaxSetup()更改

  44. $.get( );

  45.  
  46.  
  47. // $.post()在内部调用$.ajax()时已设置type为"POST",因此仍然使用POST方式。

  48. // url也被设置为"user/action.php?method=addUser"

  49. // 但async、headers、error等参数的默认值已被$.ajaxSetup()更改

  50. $.post( "user/action.php?method=addUser" );

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值