Jsonp post 跨域方案
本文给大家讲述的是个人在一个项目中遇到的关于jsonp的post跨域问题的解决过程,这里记录下来,分项给大家。最终问题得以解决,今天抽空与大家分享下。
处理的问题是国际化语言切换,SSO中选择语言需要带入各个应用中,在SSO中前台调用各个应用的后台方法,SESSIONID相同, 在当前浏览器中访问其它应用则语言带过去了.
原理: 同一个浏览器中调用A应用的SESSIONID只会生成一个,利用此原理,在SSO调用其它A应用,B应用语言ID就简单了.
前台的ajax调用方法:
$.ajax({
url: 'http://'+data.APP_HOST+'/'+data.APP_PROJECT_NAME+'/login.spr?method=setResLocaleOutSys&language='+that.setLang,
type:'POST',
cache:false,
data:{"openId":''},
dataType: 'jsonp',
jsonp:'jsoncallback',
crossDomain: true,
success:function(data) {
console.log('设置成功! '+this.url);
console.log(data);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
console.log(XMLHttpRequest.status); // 200
console.log(textStatus); // parsererror
console.log(errorThrown); // SyntaxError: Unexpected end of input
}
});
注:
type:’POST’, 请忽略,因为这个请求会以GIT的方式去调用,以下是抓包结果:
后台接口接收的方法:
@RequestMapping(params = "method=setResLocaleOutSys")
@ResponseBody
public void setResLocaleOutSys(HttpServletRequest request,HttpServletResponse response) {
try {
// 客户端请求参数
String jsoncallback = request.getParameter("jsoncallback");
HashMap<String, Object> map = new HashMap<String, Object>();
String language = request.getParameter("language");
//设置语言并放到session中
request.getSession().setAttribute("language", language);
resMessageSource.setResLocale(language);
map.put("STATUS", "SUCCESS");
map.put("SESSIONID", request.getSession().getId());
response.getWriter().print(jsoncallback + "(" + JSONObject.fromObject(map) + ")");
} catch (IOException e) {
logger.info("异常:", e);
}
}
https://blog.youkuaiyun.com/zhoucheng05_13/article/details/78694766