摘要
最近几年,采用前后端分离开发的项目很是常见。由于前后端分离后,可能会放在两个不同的服务器,需要独立部署,两个不同的工程,两个不同的代码库,不同的开发人员,挂靠不同的域名,因此也存在了跨域的问题。
在开始解决这个问题之前先了解一下什么是CORS(跨域资源共享):
跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
Java代码
下面使用CORS中最常见最方便的方法:
CORS类
public class CORS{
public void CORSTool(HttpServletResponse response, HttpServletRequest request){
// 设置:Access-Control-Allow-Origin头,处理Session问题
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("P3P", "CP=CAO PSA OUR");
if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
response.addHeader("Access-Control-Allow-Methods", "POST,GET,TRACE,OPTIONS");
response.addHeader("Access-Control-Allow-Headers", "Content-Type,Origin,Accept");
response.addHeader("Access-Control-Max-Age", "120");
}
}
}
调用CORS的方法,举例如下
@RequestMapping("/selectOne")
@ResponseBody
public Map<String,Object> selectOne(HttpServletResponse response, HttpServletRequest request){
Cors cors=new Cors();
cors.corsInfo(response,request);
Map<String,Object> map=new HashMap<>();
Notice list = noticeService.selectNoticeById(noticeId);
map.put("data",list);
return map;
}
前端代码
<input type="button" id="list" value="查询">
<script>
/* cors测试 */
$("#list").click(function(){
$.ajax({
url:"http://localhost:8080/abc/selectOne",
type:"GET",
dataType:"json",
success: function(data){
alert("名字:"+data.name);
},
error: function(){
alert("服务器异常");
}
});
});
</script>
最后
使用CORS简单请求,对于前端来说无需做任何配置,与发送普通ajax请求无异。CORS的配置,完全在后端设置,配置起来也比较容易,目前对于大部分浏览器兼容性也比较好,CORS优势也比较明显,可以实现任何类型的请求。