Struts2与JQurey ajax配合跨域请求


ajax

		$.ajax({
			url:"https://www-xxx.com/xxx/getCounselorDetailByHxCode",
			data: {xxx:x},
			dataType : 'jsonp',
			jsonp:"callback", 
			type:'post',
			
			error: function(data) { 
				console.log(data);
			},
			success:function(data){
			//	alert("suc");
				console.log(data);

			},
		});

其中 dataType指定为jsonp,jsonp 指定为 callback(随意),然后看struts2的配置:

		<action name="getCounselorDetailByHxCode"
			class="xxx" method="getCounselorDetailByHxCode">
			<result name="success" type="json">
				<param name="callbackParameter">callback</param>
				<param name="noCache">true</param>
			</result>
		</action>

其中,这一条

<param name="callbackParameter">callback</param>
中callback与ajax中jsonp字段设置相同

打印出来的 data 是 structs请求类实例的所有能够get的成员对象:

HXCodeList: null
HXType: null
content: null
counselorDetail: "success"
counselorDetailByHxCode: "success"
spResult: Object
typetypeStr: null
urlStr: null
userHXCode: "zeKNVeDc208"
userHXSubCode: null
userInfoId: null
__proto__: Object


js中,

data = data.spResult;
con += '<br><img src="' + data.body.counselorMap.userIcon + '" width="150px" />';


来访问结果



201611.1 补充:

jsonp方式跨域只能是字符串,所以struts在返回时应指定字符串变量



			<result name="success" type="json">
				<param name="root">jsonpResult</param>
				<param name="callbackParameter">URGOO_CALLBACK</param>
				<param name="noCache">true</param>
			</result>



其中,jsonpResult 为 String 类型

	public String actionMethod() throws Exception {
		spResult = serviceMethod();
		jsonpResult = JsonUtils.convert(spResult) ;
		return SUCCESS;
	}


除此之外,还有一种方法可以指定跨域:


在 actionMethod中,

		HttpServletResponse response = ServletActionContext.getResponse();
		response.setHeader("Access-Control-Allow-Origin", "*");


此时的前端代码完全不用改变。


posted on 2016-08-31 10:29  silyvin  阅读(584)  评论(0编辑  收藏  举报