解决JS跨域与AJAX parsererror:Struts2 + Spring 实战

需积分: 50 5 下载量 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的规范。