# 11-跨域问题

浏览器的跨域访问,浏览器的跨域问题的根源是:浏览器的同源策略
比如一个网站A,一个网站B,它们有不同的域名,部署在不同的服务器上,如果A某个页面向B的某个URL发送了ajax请求,就会因为同源策略被阻止,原因是:浏览器为了能保证我们网站能足够的安全,试想一下,如果没有同源策略的保护,那么任何一个网站都可以向其他的网站发送请求,假设我是一个黑客,我在我自己的javascript里面模拟了10万个人对通一个网站同时发起ajax请求,那另外的那个网站瞬间就会因为来了大量的请求,可能造成瘫痪。所以同源策略是对我们网站的保护。所以页面的请求或者ajax只能对同页面或者同一个域名下的另外的资源进行访问,不能跨域名去访问其他的资源

# 导航

回到Spring MVC导航页

# 浏览器的同源策略

  • 同源策略阻止从一个域加载的脚本去获取另一个域上的资源
  • 只要协议、域名、端口有任何一个不同,都被当作是不同的域
  • 浏览器Console看到Access-Control-Allow-Origin就代表跨域了

# HTML中允许跨域的标签

  • img - 显示远程图片
  • script - 加载远程JS
  • link - 加载远程CSS

# Spring MVC跨域访问

  • CORS跨域资源访问

# CORS跨资源访问

  • CORS是一种机制,使用额外的HTTP头通知浏览器可以访问其他域
  • CORS附加的信息:需要在URL响应头包含 Access-Control-*指明请求允许跨域

# Spring MVC解决跨域访问

  • @CrossOrigin - Controller跨域注解(这是局部的处理)
  • <mvc:cors> - Spring MVC 全局跨域配置

增加了注解之后,其根本就是在响应头里增了Access-Control-Request-Method||Access-Control-Request-Headers这些信息,也就是说:远程的url允许跨域访问,所以浏览器就会把结果正常的显示

跨域

# @CrossOrigin局部跨域解决

//origins = "*":允许所有域名访问,实际项目中不推荐
    //maxAge = 3600:设置预检请求的缓存时间,单位秒。非简单请求每次都会有两次请求(预检请求和实际请求),maxAge就是将预检请求的结果缓存起来,下次再次访问,就直接将结果返回
    @CrossOrigin(origins = "*",maxAge = 3600)
    //@CrossOrigin
    //允许部分域名访问
    //@CrossOrigin(origins = {"http:localhost:8080","https:www.baidu.com"})
    @GetMapping("/users")
    public List<User> findByUserId() {
        User user = new User();
        user.setAge(18);
        user.setName("小红");
        user.setBirthday(new Date());
        User user2 = new User();
        user2.setAge(21);
        user2.setName("小明");
        user2.setBirthday(new Date());
        List<User> users = new ArrayList<User>();
        users.add(user);
        users.add(user2);
        return users;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# CORS全局配置

打开applicationContext.xml文件,配置如下:

<mvc:cors>
        <!--/restful/**: 含义是:只要是远程的域名访问到/restful为前缀的URI上,都会被这个策略管理-->
        <mvc:mapping path="/restful/**" allowed-origins="http://localhost:8080,http://www.baidu.com" max-age="3600"/>
    </mvc:cors>
1
2
3
4

# 注意:CORS跨域浏览器访问,指针对浏览器

CORS跨域访问,只是针对浏览器,也就是说以上的设置,只对浏览器生效,如果是对APP、微信小程序这些是不生效的

# 导航,上一页,下一页

10-JSON序列化
12-springMvc拦截器

# 支持我-微信扫一扫-加入微信公众号

Aseven公众号

# 赞赏作者

赞赏作者

# 种一棵树,最好的时间是十年前,其次是现在

立志用功,如种树然。方其根芽,犹未有干;及其有干,尚未有枝;枝而后叶,叶而后花、实。初种根时,只管栽培灌溉,勿作枝想,勿作实想。悬想何益?何不忘栽培之功,怕没有枝叶花实?