最搭了一个大数据的平台,采用前后端分离做的,各自测试好后就准备整合了,第一次干这个事情,确实没什么经验,在这里记录一下。
1、跨域是指一个域下的程序试图去请求(跳转,获取,嵌入)另一个域下的资源
这里就涉及到一个同源策略这是浏览器的基本约定,是为了保护其正常功能的安全而提出的。
同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。
当然既是约定,那么就有对应的方案来解决,这里我简单示例一下我使用的解决方案:
跨域资源共享(CORS)
这种方案如果没有带跨域的cookie
则只需要后端设置即可,如果需要带跨域cookie
,则需要前后端协作。
不携带跨域cookie
的解决方法与携带跨域cookie
时的解决方法全部标注在注释中:
我们可以创建一个过滤器,对我们被的资源全部提供跨域支持,在过滤器的doFilter
方法中添加跨域请求头,并且这些都是以键值对形式写入:
//允许跨域访问的域名:若有端口需写全(协议+域名+端口),若没有端口末尾不用加'/',如果设置值为 '*' 表示接收来自任意域的请求,当然也可以指定接收特定域的请求;
((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8080");
//((HttpServletResponse) response).setHeader("Access-Control-Allow-Origin", "*");
// 允许前端带认证cookie:启用此项后,上面的域名不能为'*',必须指定具体的域名,并且前端需要在请求中设置允许跨域cookie的属性 withCredentials: true
((HttpServletResponse) response).setHeader("Access-Control-Allow-Credentials", "true");
//允许跨域的请求方式
((HttpServletResponse) response).setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");
// 提示OPTIONS预检时,后端需要设置的两个常用自定义头
((HttpServletResponse) response).setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type,Token,Accept, Connection, User-Agent, Cookie");
//定义完跨域操作记得传递请求
chain.doFilter(request, response);
如果需要对指定的几个资源提供跨域,可以通过创建虚拟目录的方式实现对特定的几个资源做过滤拦截操作,可以参考一下这篇博客:
使用setHeader()
与addHeader
()方法的区别
这里提一下Javaweb设置请求的两种方式setHeader()
与addHeader
()方法的区别:
1、setHeader()
:如果不存在则创建并添加该请求头,如果存在那么就会覆盖
原来的value
;
2、addHeader()
:如果不存在则创建并添加该请求头,如果存在那么就不创建不覆盖
原来的value
注意请求头是以键值对(key-value)
的方式设置的。