当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 店名叫"真惠充值"

 

<think>嗯,用户想知道如何在AJAX请求中设置和传递headers参数。首先,我需要回忆一下常见的AJAX库和方法,比如原生JavaScript的XMLHttpRequest、jQuery的$.ajax,以及ExtJS的Ext.Ajax.request。用户之前的问题可能涉及到ExtJS,因为引用的内容里有提到Ext.Ajax.request。不过用户现在可能想了解更通用的方法,或者不同库的实现方式。 首先,我应该分步骤说明不同场景下的设置方法。原生JS、jQuery、Fetch API、ExtJS和Axios都是常用的方式。每个部分需要给出代码示例,并指出headers的位置和设置方式。比如在原生JS中,使用setRequestHeader方法,而jQuery中是在ajax设置的headers对象里。 然后需要注意跨域问题,因为设置自定义头可能会触发预检请求(preflight),所以服务器需要正确配置CORS响应头,比如Access-Control-Allow-Headers。引用中的信息[^2]提到了这一点,应该提醒用户这一点,避免遇到跨域错误。 可能用户在实际操作中会遇到问题,比如头信息没有正确发送,或者服务器没有正确响应,所以需要强调服务器端的配置。另外,不同库的语法差异也需要明确,比如Axios的配置对象结构,或者Fetch的Headers对象使用。 还要考虑用户可能的其他需求,比如如何添加多个头信息,或者如何处理认证头(如Authorization)。是否需要提到安全方面的注意事项,比如敏感信息不应放在headers中?不过用户的问题比较基础,可能暂时不需要深入安全细节,但可以提及常见的安全实践。 最后,生成相关问题的时候,要考虑用户接下来可能遇到的问题,比如跨域处理、不同框架的具体用法、头信息的常见用途等。这样能帮助用户进一步学习相关知识点。</think>### AJAX请求中设置headers参数的完整指南 在AJAX请求中设置headers参数是实现身份验证、跨域请求、内容协商等功能的必要操作。以下是不同场景下的具体实现方式: #### 一、原生JavaScript实现 ```javascript var xhr = new XMLHttpRequest(); xhr.open('POST', '/api/data'); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.setRequestHeader('X-Custom-Header', 'value123'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(JSON.stringify({ key: 'value' })); ``` *关键点:每个header需单独调用setRequestHeader方法* #### 二、jQuery实现 ```javascript $.ajax({ url: '/api/data', type: 'POST', headers: { "Authorization": "Bearer token123", "X-Requested-With": "XMLHttpRequest" }, data: { key: 'value' }, success: function(response) { console.log(response); } }); ``` *注意:jQuery 1.5+版本支持headers参数[^1]* #### 三、Fetch API实现 ```javascript fetch('/api/data', { method: 'POST', headers: new Headers({ 'Content-Type': 'application/x-www-form-urlencoded', 'X-API-Version': '2.0' }), body: 'name=John&age=30' }); ``` *特性:支持Headers对象管理* #### 四、ExtJS实现(特殊框架) ```javascript Ext.Ajax.request({ url: 'tiqu_prdt', method: 'POST', headers: { "vn_token": token, "X-Custom-Header": "ext_value" }, success: function(response) { console.log(response); }, params: { page: 1 } }); ``` *注意:headers参数需直接配置在请求对象中[^1]* #### 五、Axios实现(现代方案) ```javascript axios.post('/api/data', { data: 'test' }, { headers: { 'Authorization': 'Basic xyz', 'Accept-Language': 'zh-CN' } }); ``` ### 关键注意事项 1. **跨域请求**:需配置服务器响应头 ```http Access-Control-Allow-Headers: accept, x-requested-with, Content-Type, X-Custom-Header ``` 确保包含所有自定义header[^2] 2. **安全头限制**:部分头(如`Cookie`, `Host`)受浏览器安全策略限制不可修改 3. **内容协商**:`Content-Type`头需与实际数据格式一致 4. **认证头处理**:推荐使用标准`Authorization`头携带令牌
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值