jsonp实现浏览器跨域请求 解决同源策略问题
程序员文章站
2024-02-18 23:53:34
...
背景:分布式商城项目中,订单页面点击登录按钮,此时要验证是否已经登录,验证请求访问登录的服务器,以获取登录标志返回到订单页面。此时由于同源策略,订单页面无法与不是订单服务器的服务器进行沟通,即订单页面无法与登录服务器沟通。
解决办法是:HTML的<script>元素是个例外,具有开放策略,订单网页与登录服务器沟通后,服务器不再返回json,而是返回任意的javaScript,即jsonp格式,这样的格式能被订单网页接收。
问题代码:
jsp
$(function(){
//去判断用户是否登陆 0 1
$.ajax({
url : "http://localhost:8082/new/isLogin.aspx",
type : "post",
dataType : "json",
success : function(data){
//判断 0 1
//alert(data);
if(data){
$("#login").hide();
$("#regist").hide();
}else{
$("#logout").hide();
$("#myOrder").hide();
}
}
});
})
java
/**
* 判断是否登录,返回登录标志0,未登录;1,已登录
* @param request
* @param response
*/
@RequestMapping(value="/isLogin.aspx")
public void isLogin(HttpServletRequest request , HttpServletResponse response) {
Integer result = 0; //默认0,未登录
String username = sessionProvider.getAttribute(RequestUtils.getCSESSIONID(request, response));
if (null !=username) {
result = 1;
}
response.setContentType("application/json;charset=UTF-8");
try {
response.getWriter().write(result);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通过使用jsonp解决跨域问题
jsp代码:dataType改为jsonp
$(function(){
//去判断用户是否登陆 0 1
$.ajax({
url : "http://localhost:8082/new/isLogin.aspx",
type : "post",
dataType : "jsonp",
success : function(data){
//判断 0 1
//alert(data);
if(data){
$("#login").hide();
$("#regist").hide();
}else{
$("#logout").hide();
$("#myOrder").hide();
}
}
});
})
java代码:
@RequestMapping(value="/isLogin.aspx")
@ResponseBody
public MappingJacksonValue isLogin(String callback, HttpServletRequest request , HttpServletResponse response) {
Integer result = 0; //默认0,未登录
String username = sessionProvider.getAttribute(RequestUtils.getCSESSIONID(request, response));
if (null !=username) {
result = 1;
}
//返回jsonp,callback里接收ajax传过来的MappingJacksonValue
MappingJacksonValue mjv = new MappingJacksonValue(result);
mjv.setJsonpFunction(callback);
return mjv;
}
callback,接收的是订单页面传递过来的jquery,
下一篇: 记录一个因网络同源策略引起的错误