最近在完善系统项目,选择了远程调用原SSH项目中的已有action处理请求,也涉及到了跨域问题,没有系统的解决过,所以此次查询解决过程也是一个很好的学习经历。Ajax跨域一般使用的方法有:
- 通过Flash插件发送HTTP请求,这种方式可以绕过浏览器的安全限制,但必须安装Flash插件,并与它进行一定的交互,使用较少。
- 通过在同源域名下架设一个代理服务器来转发,JS负责把请求发送到代理服务器上
- JSONP 主要用于主流浏览器的跨域数据访问问题
- CORS 跨域资源共享,是一种允许当前域的资源被其他域的脚本请求访问机制,如果浏览器支持HTML5,那么就可以一劳永逸的使用新的策略:CORS进行跨域,服务器端对CORS的支持主要是通过设置Access-Control-Allow-Origin来进行的。
这里只是简单阐述了几种常见的跨域方法,在这里主要讨论的是JSONP进行跨域。
<script language="javascript">
$(document).ready(function () {
$("#button").click(function () {
var user = $("#User").val();
var password = $("#Password").val();
$.ajax({
url: "http://ip:8080/Test/ajax_json/jiadan.action",
asynnc:false,
cache:false,
data: {
'User' : user,
'Password' : password
},
dataType: 'jsonp',
jsonp:"callback",
type: 'post',
success: function (data) {
alert("成功");
console.log(data);
},
error:function(data){
alert("错误");
console.log(data);
}
});
});
});
</script>
访问的是SSH项目中的struts,在struts中设置
<package name="ajax_json" extends="json-default">
<action name="jiadan" class="modelsave" method="text"><result name="success" type="json">
<param name="root">results</param>
<param name="callbackParameter">callback</param></result>
</action>
</package>
param设置的是返回参数,在action类中必须有set、get方法,callback是回调函数名称,否则前端接收到的都是error信息,不会进入success,callback可以不赋予回调函数名称,当然也可以自定义函数名称
jsonpCallback:'jsonpCallback'
前端接收到的data就是param设置的results
ps:默认设置下ajax的请求均为异步请求,如果将async设置为false,请求为同步请求,浏览器将会锁住,执行完一个请求才会执行下一个请求。
其实还可以采用一种方法,在action中设置response头部的值为:
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Origin", "*");
前端可以不使用jsonp进行跨域,不过这种方法不安全,不建议使用。