前端跨域请求有个讲解很详细的地址:
https://segmentfault.com/a/1190000011145364
跨域是相对于同源而言,同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
由于目前 大多静态文件和动态文件部署在不同服务器地址下,因此在加载时,就牵扯到需要跨域获取资源数据。
常用的有:
jsonp跨域(参见jquery Ajax传输)
$.ajax({ url: serverUrl + "login", type: "POST", dataType: "jsonp", jsonp: "callbackparam", data: {***}, success: successCallback, error: errorCallback });
callbackparam:这个可写成任意值,但是在后台传递回来时,也要保持一致。
Java后台接收数据:
String key = request.getParameter("callbackparam");
String result = key + "(" + GroupUtils.mapper.writeValueAsString(returnMap) + ")";
response.getWriter().print(result);
也可采用跨域资源共享(CORS),这样ajax就可以像平常数据传送一样,传递数据。
普通跨域请求:只服务端设置Access-Control-Allow-Origin即可。
大多在总过滤器中添加即可。
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", "*"); //response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); chain.doFilter(req, res); }
对于cros的ajax跨域请求session丢失的问题,由于跨域导致session无法传递,这样服务端会认为是一次新的登录而创建新的session.
res.setHeader("Access-Control-Allow-Credentials", "true"); res.setHeader("XDomainRequestAllowed","1");
在ajax中设置跨域允许:
xhrFields: { withCredentials: true }, crossDomain: true,
以下为其它跨域请求方式:
postmessage(主页面和子页面数据通信)
ngix和nodejs代理服务器控制
WebSocket协议跨域