前言:

由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串。

之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后根据标识“isNotLogin”进行页面的跳转,但是这样也很麻烦,每一个ajax请求之后,都需要写一句if(returnStr=="isNotLogin"){ window.location.href="xxxxxx" }

查了资料,试了一下ajaxSetup方法,可以给所有的ajax请求设置初始化,个人觉得就类似一个ajax拦截器吧,虽然也需要在每一个需要使用的jsp中进行引用,不过已经方便很多了,减少了重复代码

1.struts.xml

之前贴过,就不再贴了

2.Interception的doIntercept方法中的关键代码

//ajax请求的处理
if (request.getHeader("X-Requested-With") != null && request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest"))
{
PrintWriter out = response.getWriter();
out.print("isNotLogin");//返回一个标识给前端
out.flush();
out.close();
return null;
} //http请求的处理
else
{
//直接跳转到登录页面
return "login";
}

3.写一个单独的js文件,使用jQuery.ajaxSetup() 方法设置全局 AJAX 默认选项,捕获刚刚在拦截器里传递的值

$.ajaxSetup({
cache: false, //关闭ajax缓存
contentType:"application/x-www-form-urlencoded;charset=utf-8",
//complete:表示完成请求后触发。即在success或error触发后触发。也有success: 和 error: 等参数,根据需要来
complete:function(XHR,textStatus){
var resText = XHR.responseText;
/*根据拦截器传递的标识,进行相关操作*/
//isNotLogin标识用户当前未登录,需要将页面转到登录页面
if(resText=='isNotLogin'){
window.location=basePath+"/web/tologin.html";
}
//isCookieLogin标识当前用户可使用cookie信息进行自动登录
else if(resText=='isCookieLogin'){ }
}
});

20150708补充

由于$.ajaxSetup级别太高,考虑到只是在请求成功后执行此操作,使用ajaxSuccess更符合需要。

!!!一定要注意ajaxSuccess的执行时机-->

ajaxSuccess只会在

success: function(data) {
……
}

success后的函数内容全部执行完毕后才会触发。

因此假如本来某个ajax请求的预期返回结果是一个json字符串,但是,如果该请求被拦截器拦截掉了,

且拦截器返回了一个"isNotLogin",很明显不是json格式,那么很有可能后面的js就会出错,js出错就会导致程序中断。这种情况目前还没找到一劳永逸的解决办法,能想到的是可以在前台得到返回值之后进行数据格式的判断或者写try-catch,我使用的是第二种,这样子如果js出错了程序还能继续走,走到ajaxSuccess,相应的页面跳转才能成功完成。

公共的js登录拦截器代码如下:

//当页面中所有ajax请求成功时执行下面的代码
$(document).ajaxSuccess(function (event,xhr,settings){
/*
event:触发的事件对象
xhr:XMLHttpRequest对象
settings:可以获取当前ajax请求中的参数,
例如setting.url表示请求的url地址,
可以以此来过滤指定的ajax请求
*/
//alert("ajaxSuccess:"+settings.url);
var resText = xhr.responseText; /*根据拦截器传递的标识,进行相关操作 */
//isNotLogin标识用户当前未登录,需要将页面转到登录页面
if(resText=="isNotLogin"){
window.location=basePath+"/web/register_toLogin.html";
}
//isCookieLogin标识当前用户可使用cookie信息进行自动登录
else if(resText=="isCookieLogin"){ } });

顺便贴一下几个全局 Ajax 事件处理器的执行顺序:

关于ajax请求的详细说明的链接:

http://www.cnblogs.com/heyuquan/archive/2013/05/13/js-jquery-ajax.html

4.将上面的js文件在每一个需要判断是否登录的jsp中进行引用,即可

  • 大小: 54.1 KB
  • 大小: 51.8 KB

Struts2 在登录拦截器中对ajax请求的处理的更多相关文章

  1. struts2自定义登录拦截器

    版权声明:本文为博主原创文章,未经博主允许不得转载. (1)配置web.xml,让xml加载struts2框架 <?xml version="1.0" encoding=&q ...

  2. 用户登录拦截器查询到登录用户后如何将用户信息传递到后面的Controller

    taotao创建订单代码中之前忘了加入用户信息,那么加上呢? 分析:用户创建订单的时候,我们会强制要求用户先登录,也就是说,创建订单的Controller执行时,一定是用户已经登录了的,而用户只要登录 ...

  3. spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  4. 【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式

    背景: 在做前后端分离时,牵扯到跨域,但是已经设置了跨域 前端设置了允许携带Cookie axios.defaults.withCredentials = true; 后端也配置了跨域 浏览器端查看发 ...

  5. Struts2 在拦截器中向Action传参

    struts.xml配置文件: <package name="system-default" extends="struts-default" abstr ...

  6. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  7. Struts2透过自定义拦截器实现登录之后跳转到原页面

    Struts2通过自定义拦截器实现登录之后跳转到原页面 这个功能对用户体验来说是非常重要的.实现起来其实很简单. 拦截器的代码如下: package go.derek.advice; import g ...

  8. nodejs+express中设置登录拦截器

    在nodejs+express中,采用nodejs后端路由控制用户登录后,为了加强前端的安全性控制,阻止用户通过在浏览器地址栏中输入地址访问后台接口,在app.js中需要加入拦截器进行拦截: /*** ...

  9. [技巧篇]08.Struts2拦截器中获取Servlet API方法

    讲课中遇到的解决Session拦截器的后腿问题,还有如何在拦截器中获取Servlet API,这里留一个备注,方便学生查找

随机推荐

  1. [数据结构】【c语言】链表的创建和遍历

    第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include<stdio.h> #includ ...

  2. Django REST framework 分页

    三种分页:根据页码.根据索引.根据加密 http://www.xx.com/courses/?page=1&size=10 http://www.xx.com/courses/?offset= ...

  3. JavaScript学习笔记之DOM介绍

    目录 1.简介 2.方法 3.属性 4.访问节点 5.修改节点 6.添加节点 7.删除节点 8.替换节点 9.改变 CSS 1.简介 文档对象模型(Document Object Model,DOM) ...

  4. (蓝桥杯)第八届A组C/C++跳蚱蜢

    #include<iostream> #include<memory.h> #include<stack> #include<string> #incl ...

  5. Linux - nginx+uWSGI+django+virtualenv+supervisor发布web服务器

    目录 Linux - nginx+uWSGI+django+virtualenv+supervisor发布web服务器 crm django项目部署流程 使用supervisro启动uwsgi,退出虚 ...

  6. jQuery学习----简单介绍,基本使用,操作样式,动画

    jQuery简单介绍 jq是js的插件库,说白了,jq就是一个js文件 凡事能用jq实现的,js都能实现.但是js能实现的,jq不一定能够实现 jq的引入 http://www.bootcdn.cn ...

  7. 【Codeforces 522A】Reposts

    [链接] 我是链接,点我呀:) [题意] 有人转载官方号的动态. 又有其他人转载其他人转载的动态. 问你最长的一条转载动态的链有多长. [题解] 用map把每个人的英文都转成小写的 然后从map中获取 ...

  8. 【codeforces 776E】The Holmes Children

    [题目链接]:http://codeforces.com/contest/776/problem/E [题意] f(n)是小于n的不同整数对(x,y)这里x+y==n且gcd(x,y)==1的个数; ...

  9. deepin下使用python遇到的一些情况

    1.系统自带python2.7和python3.5,直接运行python默认的是2.7版本的 当然直接运行python的默认版本是可以修改的,参考这里 然后可能需要3.6版本的话,就直接在命令行输入 ...

  10. zookeeper概念与原理

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. 1 Zookeeper的基本概念 1.1 角色 ...