在我们开发当中  经常会碰见跨域问题 今天我来说下 我在工作撞见的跨域;

一.首先我们要了解跨域存在的原因

1、浏览器限制

2、跨域(域名,端口不一样都是跨域)

3、XHR(XMLHttpRequest请求)

解决方案

    • 【策略一】Jsonp 需要目标服务器配合一个callback函数

      从XHR(XMLHttpRequest)出发

      避免发生跨域。使用jsonp,由于jsonp请求是通过script的方式发送的(只有xhr的请求方式才有可能产生跨域问题),所以不会产生跨域问题。Spring MVC实现过程:前台使用ajax的get请求,将dataType设为“jsonp”;服务器创建一个类并继承抽象类AbstractJsonReponseBodyAdvice,最后注解@ControllerAdivece。使用jsonp的弊端,只能使用get方式请求,服务器需要改动代码,发送的不是xhr请求。


    •  使用该方式的缺点:请求方式只能是get请求
    • 方式二:使用jQuery的jsonp插件
      插件下载网址:https://github.com/jaubourg/jquery-jsonp
      前端代码

      服务器代码

    • 使用该方式的特点:与方式一相比,请求方式不只局限于get请求,还可以是post请求,但从服务器从获取的数据依然是jsonp格式

      • 【策略二】修改服务端代码 支持跨域
      • 产生跨域后解决。

        从被调用方考虑,有三种情况,分别是服务器实现,nginx配置和apache配置。

        服务器实现需要注意两种情况,简单请求和非简单请求。简单请求是先执行请求再验证,非简单请求是先验证再请求。

        简单请求(比较常见):方法为get,head,post,请求header里面没有自定义头,Content-Type的值为以下几种 text/plain,multipart/form-data,application/x-www-form-urlencoded。

        非简单请求(比较常见):put,delect方法的ajax请求,发送json格式的ajax请求,带自定义头的ajax请求。

        简单请求处理方案:在响应头中添加

        Access-Control-Allow-Origin=“允许跨域的url”,即跨省域时,请求头Origin的值,所以一般是获取Origin的值。

        Access-Control-Allow-Method=“*”,允许的方法。

        非简单请求处理方案:在相应头中添加

        Access-Control-Allow-Origin=“允许跨域的url”,即跨域时,可以获取请求头Origin的值。

        Access-Control-Allow-Method=“*”,允许的方法

        Access-Control-Request-Headers=“Content-Type,自定义的header的key”。

        带cookies的跨域解决:在响应头添加

        Access-Control-Allow-Credentials,="true",允许使用cookies

      • 服务器代码

        使用该方式的特点:与前两种方式相比,前端代码和未处理跨域前一样,即普通的ajax请求,但服务器代码添加了一段解决跨域的代码
            // 设置: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高级使用:在springmvc中配置拦截器
        创建跨域拦截器实现HandlerInterceptor接口,并实现其方法,在请求处理前设置头信息,并放行

        在springmvc的配置文件中配置拦截器,注意拦截的是所有的文件

      • 被调方的nginx 处理
      • ngnix配置:

        apache配置:没搞过

        若是使用spring框架:使用@CrossOrigin注解既可以实现服务端跨域

      • 调用方的nginx处理
      • 修改站点的nginx配置文件并重启nginx

        server {
        listen 80;
        server_name www.a.com;
        access_log logs/test.access.log;
        # 匹配以/apis/开头的请求
        location ^~ /apis/ {
        proxy_pass http://www.b.com/; #注意域名后有一个/
        }
        location / {
        root html/a;
        index index.html index.htm;
        }
        #
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        root html;
        }
        }

        没错就是proxy_pass后面的地址加一个/

java跨域的更多相关文章

  1. java 跨域

    jsonp做前端跨域需要服务器的支持的,造成json字符串前缀 var a=...或者 a[].... 实在有点麻烦,故还是后台跨域取数据好了 package com.pro.domain; impo ...

  2. Java跨域设置

    Access-Control-Allow-Origin 为允许哪些Origin发起跨域请求. 这里设置为"*"表示允许所有,通常设置为所有并不安全,最好指定一下. Access-C ...

  3. Java跨域问题的处理详解

    1,JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题? 答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策 ...

  4. JAVA跨域CORS

    写了一个前端vue调用后端Java的接口,报“Access-Control-Allow-Origin”问题.

  5. JAVA跨域资源访问CORSFilter

    当一个资源从与该资源本身所在的服务器不同的域或端口不同的域或不同的端口请求一个资源时,资源会发起一个跨域 HTTP 请求. 出于安全考虑,浏览器会限制从脚本内发起的跨域HTTP请求.跨域资源共享机制允 ...

  6. Java跨域问题的处理

    1,JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题? 答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策 ...

  7. JAVA跨域、RestTemplate高并发下异常与配置、JSON数据Long转String

    ## 跨域支持 import org.springframework.context.annotation.Bean; import org.springframework.context.annot ...

  8. java跨域配置

    一.问题 使用前后端分离模式开发项目时,往往会遇到这样一个问题 -- 无法跨域获取服务端数据 这是由于浏览器的同源策略导致的,目的是为了安全.在前后端分离开发模式备受青睐的今天,前端和后台项目往往会在 ...

  9. Java跨域以及实现原理

    最近研究了一下跨域,没接触之前我的印象就是配合单点登录的一种方式,后来在网上看到资料才知道不仅仅是这一种,用法很多,具体的可以去网上搜索. 一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访 ...

随机推荐

  1. vue--vant组件库field输入框

    安装vant UI框架: cnpm install vant –-save-dev 导入组件-在main.js里: import Vant from 'vant'; import'vant/lib/v ...

  2. POJ 3616 奶牛挤奶

    Milking Time 贝茜是一个勤劳的牛.事实上,她如此​​专注于最大化她的生产力,于是她决定安排下一个N(1≤N≤1,000,000)小时(方便地标记为0..N-1),以便她生产尽可能多的牛奶. ...

  3. linux指令(1)

    1) date: 日期与秒的转换 (seconds since 1970-01-01 00:00:00 UTC) [root@laas:~]# date --date=2019-12-31 +%s15 ...

  4. 在vue中调用echarts中的地图散点图~

    首先!当然是在vue中引入echarts! 命令行  npm install echarts --save 在main.js文件中里引入        import echarts from 'ech ...

  5. linux添加本地yum源

    增加一块硬盘 然后格式化成btrfs格式的文件 mkfs.btrfs /dev/sde 永久挂载 echo "/dev/sde /mnt btrfs defaults 0 0" & ...

  6. 服务定位器(Service Locator)

    服务定位器(Service Locator) 跟DI容器类似,引入Service Locator目的也在于解耦.有许多成熟的设计模式也可用于解耦,但在Web应用上, Service Locator绝对 ...

  7. Model First 开发方式

    概述 在项目一开始,没有数据库时,可以借助 EF 设计模型,然后根据模型同步完成数据库中表的创建,这就是 Model First 开发方式. 总结一点就是:现有模型再有表. 创建 Model Firs ...

  8. 基于VC++的网络扫描器设计与实现

    本文正文其实是自己的毕业论文,现在搬上来有两个原因. 一是之前大学的文档都放在百度网盘上,大概去年的时候百度网盘改版搞得不太稳定,文件夹移动次数一多里边就会有一些文件丢失了,也没有很在意.但前几天看申 ...

  9. 版本控制,django缓存,跨域问题解决

    复习 分页: 1. 简单分页 2. 偏移分页 3. 加密分页 解析器:客户处理前端提交来的数据 urlencode: body体中的数据格式: key=value& formdata编码:为区 ...

  10. 微信中扫描二维码自动打开手机系统默认浏览器下载APP(APK)

    很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们实现微信跳转功能即可.下面给大家介绍这个功能 功能目的 生成微信跳转链接,实现微信内置浏览 ...