Ajax跨域访问SSH action问题

来源:互联网 发布:win7显示网络连接图标 编辑:程序博客网 时间:2024/06/16 00:47
最近在完善实验室的一体化系统项目,到最后的整合调用算法模型,因为时间紧迫,就选择了远程调用原SSH项目中的已有action处理请求,也涉及到了跨域问题,没有系统的解决过,所以此次查询解决过程也是一个很好的学习经历。Ajax跨域一般使用的方法有:
  1. 通过Flash插件发送HTTP请求,这种方式可以绕过浏览器的安全限制,但必须安装Flash插件,并与它进行一定的交互,使用较少。
  2. 通过在同源域名下架设一个代理服务器来转发,JS负责把请求发送到代理服务器上
  3. JSONP 主要用于主流浏览器的跨域数据访问问题
  4. 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", "*");
前端可以不使用jsonp进行跨域,不过这种方法不安全,不建议使用。

原创粉丝点击