`

当ajax遇到token的时候

阅读更多

       struts2 的token机制在这里就不详细的描述了,大体上是:

       在表单提交页面加上<s:token/>标签,在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏域如:

  1. <input type="hidden" name="struts.token.name" value="token"/>  
  2. <input type="hidden" name="token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
  3.        并且将该GUID存放在session中,作为提交时的表示,防止重复提交。
  4. 以下是我的应用场景:
  5.        由于某些特殊的原因,我的一些表单数据需要通过ajax提交到后台,当struts的校验不通过时,我还需要将相应的错误信息显示到前台的jsp,具体请看下面的js脚本:
  6.        这是ajax请求成功后的处理方法,js脚本10-15需要重点关注。
  7. Core.ajaxSuccess = function(data) {
    	
    	if (data.actionErrors && data.actionErrors.length > 0) {
    		$.each(data.actionErrors, function(name, value) {
    //			$.messager.alert(value, 'error');
    			Core.errorAlert(value);
    		});
    		return false;
    	}
    	if (!jQuery.isEmptyObject(data.fieldErrors)) {
    		$("[id^='error_']").text("");
    		$.each(data.fieldErrors, function(name, value) {
    			$("[id='error_" + name + "']").text(value);
    			
    		});
    		return false;
    	}
    	
    	if (data.actionMeassages && data.actionMeassages.length > 0) {
    		$.each(data.actionMeassages, function(name, value) {
    //			$.messager.alert(value, 'error');
    			Core.successAlert(value);
    		});
    		return true;
    	}
    
    	Core.successAlert();
    	return true;// 返回true表示响应中无错误信息
    };
            请注意,当第一次提交时,验证不通过,会提示相应的错误信息;但是当修改信息后再一次提交时,后台会报出当前TOKEN不存在的错误,恩?这是怎么回事呢?仔细查看之下发现struts2 的GUID是在页面加载的时候生成并存放在session中的,并且标示为struts.tokens.token;ajax请求完成后,页面并没有重新加载,所以导致GUID没有重新生成,而此时session中的GUID已经在第一次请求时匹配而被清空了;当第二次在请求时,在session中没有相应的GUID,问题被发现,现在我们要解决它……
  8.        我的解决方案是,验证没有通过时,生成一个GUID返回到前台页面,存入 name="token" 的input中,这样再次请求时,就不会出现session中的GUID和页面请求的GUID不匹配的问题了!!!
  9.        以下是我的action处理代码:
  10. @Override
        public void validate() {
            super.validate();
    
            Map<String, List<String>> fieldErrors = this.getFieldErrors();
            if ((fieldErrors != null) && !fieldErrors.isEmpty()) {
                String struts_token = null;
                if ((this.request != null) && (this.request.getSession() != null)
                        && (this.request.getSession().getAttribute(TOKEN_SEESION_NAME) != null)) {
                    this.request.getSession().getAttribute(TOKEN_SEESION_NAME).toString();
                }
                if (StringUtils.isEmpty(struts_token)) {
                    struts_token = this.customTokenValue();//生成一个MD5串
                    this.request.getSession().setAttribute(TOKEN_SEESION_NAME, struts_token);
                    this.addFieldError("struts_token", struts_token);
                }
            }
        }
           以下是部分js脚本:
  11. if (!jQuery.isEmptyObject(data.fieldErrors)) {
    		$("[id^='error_']").text("");
    		$.each(data.fieldErrors, function(name, value) {
    			if (name == 'struts_token') {
    				$("[name='token']").val(value);
    			}
    			else {
    				$("[id='error_" + name + "']").text(value);
    			}
    		});
    		return false;
    	}
     
  12.         这里提供的是一种思路,通过struts标签生成的GUID需要重新加载页面才能生效,当这种机制行不通的时候,我们需要另辟蹊径处理token相关的问题了;这里说的是struts验证不通过的问题,可能你还会遇到别的类似的问题,一样的找到你的GUID存放位置,重新设置GUID值,传值到前台,解决该问题。。。
  13.        欢迎各位大牛批评指正,有任何问题请联系我,邮箱:xulonghui2011@163.com 
  14.        另外 淘宝小店做一些话费、QQ相关和一些点卡的充值业务,有需要的,可以进去看看,地址: http://shop104105266.taobao.com 店名叫"真惠充值"

 

1
2
分享到:
评论
4 楼 xulonghui2011 2013-07-24  
zskangs1126 写道
     
谢谢
3 楼 xulonghui2011 2013-07-24  
zcx12141214 写道

谢谢
2 楼 zcx12141214 2013-07-24  
1 楼 zskangs1126 2013-07-22  
     

相关推荐

    Django解决Ajax中post提交数据403的代码

    然而,在使用Ajax向Django后端发送POST请求时,可能会遇到403 Forbidden错误,提示“CSRF token missing or incorrect.”。这个问题是由于Django的安全机制——跨站请求伪造(Cross-Site Request Forgery,简称CSRF...

    ajax跨域问题!

    当网站需要与非同源的第三方服务器进行交互时,就会遇到跨域问题。例如,在当前页面`http://a.com`上通过AJAX请求`http://b.com`的数据,就会因为同源策略的限制而失败。 #### 三、JSONP原理及示例 为了解决跨域...

    关于Ajax的视频,讲的还可以

    8. **错误处理**:Ajax请求可能会遇到各种问题,如网络中断、服务器错误等。因此,良好的错误处理机制至关重要,包括异常捕获、超时处理和重试策略。 9. **安全考虑**:使用Ajax时,要注意防止XSS(跨站脚本攻击)...

    struts1.2之token解决重复提交

    但需要注意的是,Token机制并不能解决所有类型的重复提交问题,例如异步请求(Ajax)的重复提交。在这种情况下,通常需要在客户端进行额外的控制,比如使用JavaScript禁用提交按钮。 总的来说,理解并正确使用...

    解决Django提交表单报错:CSRF token missing or incorrect的问题

    当你遇到"CSRF token missing or incorrect"的错误时,这通常意味着在处理表单提交时,Django无法找到或验证有效的CSRF令牌。 首先,我们来理解Django中的CSRF机制。Django会在用户首次访问网站时生成一个唯一的...

    ajax实现excel报表导出

    项目中遇到一个场景,要导出一个excel报表。由于需要token验证,所以不能用a标签;由于页面复杂,所以不能使用表单提交。初步考虑前端使用ajax,后端返回流,定义指定的header。 第一版 主要代码 前端 使用jquery的...

    基于Ajax的chat实现

    同时,也需要处理用户的输入,当用户发送消息时,同样使用Ajax将消息发送到服务器。 5. **后端处理** 后端通常负责接收和处理Ajax请求,以及存储和检索聊天记录。这可能涉及到数据库操作,如使用SQL查询来获取最新...

    ajax获取json数据为undefined原因分析

    总结来说,当处理Ajax获取的JSON数据出现`undefined`时,应检查数据类型、JSON格式、属性访问、异步处理、编码问题以及跨域限制等因素。理解并解决这些问题有助于确保JSON数据能够正确地被JavaScript解析和使用。...

    详解JQuery Ajax 在asp.net中使用总结

    在***中,当使用jQuery Ajax请求aspx页面时,可以有两种方式:GET和POST。在前台使用$.ajax()发起Ajax请求时,可以设置请求的类型、URL、参数等。如果要指定请求类型为POST,可以在方法参数中加入type: "Post"。而...

    django使用ajax post数据出现403错误如何解决

    为了在AJAX POST请求中携带CSRF令牌,可以在使用jQuery发起AJAX请求之前,通过监听ajaxSend事件来动态添加CSRF Token。具体实现代码如下: ```javascript $(document).ajaxSend(function(event, xhr, settings) { ...

    浅谈Ajax跨域Session和跨域访问

    Ajax跨域请求和跨域Session是前端开发中经常遇到的问题,它们对于保证Web应用的安全性和用户体验都至关重要。在处理跨域问题时,开发人员需要注意很多细节和规则,以确保数据的正确传输和用户状态的正确识别。 首先...

    Ajax请求时无法重定向的问题解决代码详解

    根据给定的文件信息,我们可以详细地了解Ajax请求时遇到的重定向问题以及解决这一问题的代码实现。首先,我们需要明确Ajax请求的特点,以及为何它无法直接处理服务器的重定向响应。接下来,将详细介绍后端代码和前端...

    jQuery.ajax 跨域请求webapi设置headers的解决方案

    在进行Web开发时,我们经常会遇到跨域问题,特别是在使用jQuery的`$.ajax`进行Ajax请求时,如果请求的目标不在同一个源下,浏览器会因为同源策略限制而阻止请求。然而,有时候我们需要在跨域请求中传递一些自定义的...

    jQuery.Form实现Ajax上传文件同时设置headers的方法

    在现代Web开发中,通过Ajax上传文件是一种常见的需求。但在这一过程中,遇到一个问题,即如何在上传文件的同时设置HTTP请求头(headers)。传统的表单提交可以轻松上传文件,但无法自定义请求头;而Ajax请求可以设置...

    Django框架如何使用ajax的post方法

    这样,当AJAX请求从客户端发起时,就会自动附带CSRF令牌。服务器端Django在接收到含有CSRF令牌的POST请求时,会检查令牌的有效性,并允许该请求正常进行,而不是返回HTTP403错误。 此外,在Django的官方文档中,有...

    使用ajax post方法从asp按钮下载文件

    当涉及到文件下载时,一定要注意安全问题,比如防止跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。同时,不同的浏览器可能对AJAX下载有不同的支持,所以最好进行充分的兼容性测试。 以上就是使用AJAX和jQuery从ASP...

    Django中ajax发送post请求 报403错误CSRF验证失败解决方案

    为了解决Django中Ajax发送POST请求时遇到的CSRF验证失败问题,可以采取以下几种方案: 1. 在HTML模板中加入CSRF令牌:对于使用模板引擎的情况(如Django模板),可以直接在表单标签中加入`{% csrf_token %}`。这会...

    Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)

    当您收到 "419 Page Expired" 错误,这通常意味着您的 AJAX 请求没有正确地携带 CSRF 令牌,导致服务器无法验证请求的合法性。以下是两种解决此问题的方法: 1. **添加 CSRF 令牌到 HTML 头部**: 在每个需要进行 ...

    解决laravel 出现ajax请求419(unknown status)的问题

    在使用Laravel框架进行Web开发时,经常会遇到一个问题:通过Ajax发起的请求,尤其是POST请求,被服务器返回了419错误(未知状态)。这个错误通常是由于Laravel的CSRF(跨站请求伪造)保护机制导致的。为了解决这个...

    ThinkPHP下表单令牌错误与解决方法分析

    在项目的开发过程中,添加、编辑数据时偶尔会遇到系统提示的“表单令牌错误”,一开始没怎么在意,直到今天下午QA把此问题提到bug系统了,正好时间也有空余,就追着TP3.13的源码看了下去,几分钟后,便知道原委了。...

Global site tag (gtag.js) - Google Analytics