前端跨域请求有个讲解很详细的地址:

    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协议跨域

posted on 2018-03-30 15:04  zhaoqiang1980  阅读(141)  评论(0编辑  收藏  举报