解决JS跨域与AJAX parsererror:Struts2 + Spring 实战
需积分: 50 94 浏览量
更新于2024-09-08
收藏 1KB TXT 举报
"解决js跨域问题以及ajax报parsererror,主要涉及struts2+Spring框架下的JSONP处理。"
在Web开发中,由于浏览器的安全策略,不同源的JavaScript代码之间不能进行通信,这就是著名的同源策略。然而,为了实现某些功能,如前端向后端API请求数据,我们需要克服这一限制,这催生了跨域解决方案。这里,我们关注的是使用JSONP(JSON with Padding)来解决跨域问题,同时处理jQuery AJAX请求中可能出现的"parsererror"。
JSONP是一种绕过同源策略的方法,通过动态创建`<script>`标签并将其`src`属性设置为服务端的URL,由于`<script>`标签不受同源策略限制,可以加载任何源的脚本。服务端返回的不是JSON格式的数据,而是包裹在函数调用中的JSON数据,如`myCallback({key: 'value'})`。前端通过预先定义这个`myCallback`函数来接收和解析返回的数据。
在Struts2+Spring的环境中,我们可以这样处理JSONP请求:
1. **后端处理**:
- 首先,获取前端传递的回调函数名,这里是`callback`参数:`String callback = request.getParameter("callback")`。
- 然后,构建JSONP格式的响应。这里我们创建一个字符串`json`,包含回调函数名和返回的JSON数据:`json = jsonpcallback + "({returnFlag:" + bln + ",taskid:" + taskid + "});"`。
- 最后,设置响应的输入流,将JSONP字符串作为内容返回:`setInputStream(new ByteArrayInputStream(json.getBytes("UTF-8")));`,并返回ACTION的SUCCESS状态。
2. **前端使用jQuery AJAX请求**:
- 设置AJAX请求的URL,注意添加了`callback=?`,这是jQuery自动替换为实际回调函数名的地方:`url: "http://localhost:8089/xx/xx/xx.action?callback=?",`。
- 指定请求类型为GET:`type: 'GET'`。
- 数据类型设置为JSONP:`dataType: "jsonp"`。
- 定义JSONP回调函数名:`jsonp: "callback"`,与后端匹配。
- 自定义回调函数名:`jsonpCallback: "jsonpcallback"`,如果后端有特殊要求或自定义处理。
- 在`success`函数中处理返回的数据,如`alert(resp.returnFlag)`。
- 添加`error`处理函数,用于捕获并显示错误信息。
在处理JSONP时,务必确保前后端的回调函数名一致,否则前端无法正确解析服务端返回的数据,可能会导致"parsererror"。同时,后端返回的数据必须严格按照JSONP的格式,即包裹在函数调用中,否则也会导致解析失败。
在上述代码示例中,前端通过`$.ajax`发送了一个带有`callback=?`的GET请求,后端接收到请求后根据`callback`参数生成了JSONP格式的响应`jsonpcallback({returnFlag:1,taskid:1})`,最后前端的`jsonpcallback`函数被调用,从而成功接收并处理了跨域数据。
总结来说,解决js跨域和"parsererror"的关键在于理解和正确实现JSONP机制,确保前后端关于回调函数的约定一致,并且服务端返回的数据格式符合JSONP的规范。
2020-10-20 上传
2020-10-20 上传
2020-12-09 上传
2019-08-12 上传
2010-08-22 上传
2008-01-17 上传
2011-12-22 上传
2008-12-24 上传
2011-08-18 上传
幺儿的csdn
- 粉丝: 5
- 资源: 5
最新资源
- 淘淘商城源码-Java代码类资源
- mybatis - Springboot+Mybatis+MySql搭建实例.zip
- 商务团队背景的商务幻灯片下载PPT模板
- Python库 | VizKG-0.0.3-py3-none-any.whl
- 直方图修改:代码执行直方图修改-matlab开发
- Android-project-FishPond:ZJU中的Android课程,这是名为FishPond的最终项目,这是一个适合时间大师的应用
- mm-screen:马克·米纳维尼(Mark Minervini)在“像股票向导一样交易”一书中描述的股票筛选器,用于识别超级绩效股票
- POO-2021
- SergioHPassos.github.io
- Quarantine-Friends:编码Dojo小组项目
- code-red:可视化代码 RED
- EpigenomicsTask_MscOmics
- VK-DMR:VK DMR文件
- kiwi:简约的内存键值存储
- Trex-Game-2:有游戏结束条件
- Python库 | vizex-2.0.4-py3-none-any.whl