AJAX跨域实现:Java后端处理与JSON中文编码
在Java中实现Ajax跨域请求通常涉及到前端使用jQuery库配合后端Spring框架来处理JSON数据的传输。当JavaScript代码通过Ajax发起跨域请求时,浏览器出于安全考虑会默认禁止此类操作,但通过一些技术手段可以解决这个问题,其中JSONP(JSON with Padding)是一种常见的解决方案。 **前端部分:** 前端使用jQuery的`$.ajax`方法发起请求时,可能会遇到跨域问题。这时,可以通过设置`jsonp`参数或者在URL中添加特定的查询字符串(如`?callback=?`)来触发服务器端的处理。前端代码可能包含一个回调函数名作为参数,如`/relatSaveOrUpdate?callback=callbackFunName`,这里的`callbackFunName`会被服务器接收到并用于构建JSONP响应。 **后端Action层:** 在Java的`baseAction`类中的`writecallback`方法负责处理JSONP响应。它首先通过`HttpServletRequest`获取到客户端传递的回调函数名称`callbackparam`,然后生成一个随机的UUID,将其与JSON对象进行封装。为了返回JSON数据,后端设置响应头`Content-Type`为`text/plain`,然后将JSON字符串写入到响应流,格式化为`callbackFunctionName(jsonData)`的形式,这里`jsonData`是序列化后的Java对象。 **JSON序列化与解码:** `JSON.toJSONString(obj)`用于将Java对象转换为JSON字符串,确保数据能够在前后端之间正确传输。在处理中文字符时,如果直接序列化可能会出现编码问题,需要确保Java对象和JSON字符串使用相同的字符集,例如UTF-8,以便正确地处理中文字符。 **CORS设置:** 为了允许跨域请求,后端在`relatSaveOrUpdate`方法中添加了`response.setHeader("Access-Control-Allow-Origin","*");`,这表示允许来自任何源的请求。`*`通配符表示允许所有域名,但在实际生产环境中,应更具体地指定来源,以增强安全性。 总结: AJAX跨域问题在Java中主要通过JSONP技术来解决,前端通过动态构造请求URL,并设置特定的回调函数名,后端服务器接收到请求后,将数据打包成符合JSONP格式的响应发送回客户端。同时,需要注意处理JSON数据的编码问题,确保中文字符能够正确解析和显示。此外,通过CORS设置允许特定的域名访问,以避免安全风险。
public void writecallback(HttpServletRequest request,
HttpServletResponse response, Object obj) {
String callbackFunName = request.getParameter("callbackparam");// 得到js函数名称
String uuid = UUID.randomUUID().toString().replace("-", "");
try {
response.setContentType("text/plain");
String json = JSON.toJSONString(obj);
response.getWriter().write(callbackFunName + "([" + json + "])"); // 返回jsonp数据
log.error(String.format("响应信息: <%s>%s %s",
request.getRequestURI(), uuid, JSON.toJSONString(obj)));
} catch (IOException e) {
log.error("writecallback excption -> ", e);
log.error(String.format("响应信息: <%s>%s %s",
request.getRequestURI(), uuid, JSON.toJSONString(obj)));
}
}
//Action
@RequestMapping("/relatSaveOrUpdate")
@ResponseBody
public void relatSaveOrUpdate(@RequestBody String params, String map, HttpServletRequest request, HttpServletResponse response) {
String p=request.getParameter("str");
response.setHeader("Access-Control-Allow-Origin", "*");
writecallback(request, response, sensitiveService.relatSaveOrUpdate(p));
}
//serviceimpl
public Map<String, Object> relatSaveOrUpdate(String map) {
Map<String, Object> m=new HashMap<String, Object>();
下载后可阅读完整内容,剩余2页未读,立即下载
- 粉丝: 10
- 资源: 15
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展