struts2 的token机制在这里就不详细的描述了,大体上是:
在表单提交页面加上<s:token/>标签,在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏域如:
- <input type="hidden" name="struts.token.name" value="token"/>
- <input type="hidden" name="token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
- 并且将该GUID存放在session中,作为提交时的表示,防止重复提交。
- 以下是我的应用场景:
- 由于某些特殊的原因,我的一些表单数据需要通过ajax提交到后台,当struts的校验不通过时,我还需要将相应的错误信息显示到前台的jsp,具体请看下面的js脚本:
- 这是ajax请求成功后的处理方法,js脚本10-15需要重点关注。
-
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,问题被发现,现在我们要解决它…… - 我的解决方案是,验证没有通过时,生成一个GUID返回到前台页面,存入 name="token" 的input中,这样再次请求时,就不会出现session中的GUID和页面请求的GUID不匹配的问题了!!!
- 以下是我的action处理代码:
-
@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脚本: -
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; }
- 这里提供的是一种思路,通过struts标签生成的GUID需要重新加载页面才能生效,当这种机制行不通的时候,我们需要另辟蹊径处理token相关的问题了;这里说的是struts验证不通过的问题,可能你还会遇到别的类似的问题,一样的找到你的GUID存放位置,重新设置GUID值,传值到前台,解决该问题。。。
- 欢迎各位大牛批评指正,有任何问题请联系我,邮箱:xulonghui2011@163.com
- 另外 淘宝小店做一些话费、QQ相关和一些点卡的充值业务,有需要的,可以进去看看,地址: http://shop104105266.taobao.com 店名叫"真惠充值"
相关推荐
然而,在使用Ajax向Django后端发送POST请求时,可能会遇到403 Forbidden错误,提示“CSRF token missing or incorrect.”。这个问题是由于Django的安全机制——跨站请求伪造(Cross-Site Request Forgery,简称CSRF...
当网站需要与非同源的第三方服务器进行交互时,就会遇到跨域问题。例如,在当前页面`http://a.com`上通过AJAX请求`http://b.com`的数据,就会因为同源策略的限制而失败。 #### 三、JSONP原理及示例 为了解决跨域...
8. **错误处理**:Ajax请求可能会遇到各种问题,如网络中断、服务器错误等。因此,良好的错误处理机制至关重要,包括异常捕获、超时处理和重试策略。 9. **安全考虑**:使用Ajax时,要注意防止XSS(跨站脚本攻击)...
但需要注意的是,Token机制并不能解决所有类型的重复提交问题,例如异步请求(Ajax)的重复提交。在这种情况下,通常需要在客户端进行额外的控制,比如使用JavaScript禁用提交按钮。 总的来说,理解并正确使用...
当你遇到"CSRF token missing or incorrect"的错误时,这通常意味着在处理表单提交时,Django无法找到或验证有效的CSRF令牌。 首先,我们来理解Django中的CSRF机制。Django会在用户首次访问网站时生成一个唯一的...
项目中遇到一个场景,要导出一个excel报表。由于需要token验证,所以不能用a标签;由于页面复杂,所以不能使用表单提交。初步考虑前端使用ajax,后端返回流,定义指定的header。 第一版 主要代码 前端 使用jquery的...
同时,也需要处理用户的输入,当用户发送消息时,同样使用Ajax将消息发送到服务器。 5. **后端处理** 后端通常负责接收和处理Ajax请求,以及存储和检索聊天记录。这可能涉及到数据库操作,如使用SQL查询来获取最新...
总结来说,当处理Ajax获取的JSON数据出现`undefined`时,应检查数据类型、JSON格式、属性访问、异步处理、编码问题以及跨域限制等因素。理解并解决这些问题有助于确保JSON数据能够正确地被JavaScript解析和使用。...
在***中,当使用jQuery Ajax请求aspx页面时,可以有两种方式:GET和POST。在前台使用$.ajax()发起Ajax请求时,可以设置请求的类型、URL、参数等。如果要指定请求类型为POST,可以在方法参数中加入type: "Post"。而...
为了在AJAX POST请求中携带CSRF令牌,可以在使用jQuery发起AJAX请求之前,通过监听ajaxSend事件来动态添加CSRF Token。具体实现代码如下: ```javascript $(document).ajaxSend(function(event, xhr, settings) { ...
Ajax跨域请求和跨域Session是前端开发中经常遇到的问题,它们对于保证Web应用的安全性和用户体验都至关重要。在处理跨域问题时,开发人员需要注意很多细节和规则,以确保数据的正确传输和用户状态的正确识别。 首先...
根据给定的文件信息,我们可以详细地了解Ajax请求时遇到的重定向问题以及解决这一问题的代码实现。首先,我们需要明确Ajax请求的特点,以及为何它无法直接处理服务器的重定向响应。接下来,将详细介绍后端代码和前端...
在进行Web开发时,我们经常会遇到跨域问题,特别是在使用jQuery的`$.ajax`进行Ajax请求时,如果请求的目标不在同一个源下,浏览器会因为同源策略限制而阻止请求。然而,有时候我们需要在跨域请求中传递一些自定义的...
在现代Web开发中,通过Ajax上传文件是一种常见的需求。但在这一过程中,遇到一个问题,即如何在上传文件的同时设置HTTP请求头(headers)。传统的表单提交可以轻松上传文件,但无法自定义请求头;而Ajax请求可以设置...
这样,当AJAX请求从客户端发起时,就会自动附带CSRF令牌。服务器端Django在接收到含有CSRF令牌的POST请求时,会检查令牌的有效性,并允许该请求正常进行,而不是返回HTTP403错误。 此外,在Django的官方文档中,有...
当涉及到文件下载时,一定要注意安全问题,比如防止跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。同时,不同的浏览器可能对AJAX下载有不同的支持,所以最好进行充分的兼容性测试。 以上就是使用AJAX和jQuery从ASP...
为了解决Django中Ajax发送POST请求时遇到的CSRF验证失败问题,可以采取以下几种方案: 1. 在HTML模板中加入CSRF令牌:对于使用模板引擎的情况(如Django模板),可以直接在表单标签中加入`{% csrf_token %}`。这会...
当您收到 "419 Page Expired" 错误,这通常意味着您的 AJAX 请求没有正确地携带 CSRF 令牌,导致服务器无法验证请求的合法性。以下是两种解决此问题的方法: 1. **添加 CSRF 令牌到 HTML 头部**: 在每个需要进行 ...
在使用Laravel框架进行Web开发时,经常会遇到一个问题:通过Ajax发起的请求,尤其是POST请求,被服务器返回了419错误(未知状态)。这个错误通常是由于Laravel的CSRF(跨站请求伪造)保护机制导致的。为了解决这个...
在项目的开发过程中,添加、编辑数据时偶尔会遇到系统提示的“表单令牌错误”,一开始没怎么在意,直到今天下午QA把此问题提到bug系统了,正好时间也有空余,就追着TP3.13的源码看了下去,几分钟后,便知道原委了。...