跨域

浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。
如下所示
域名

  1. 域名不同 http://www.baidu.com/index.html -->http://www.sina.com/test.js
  2. 域名不同 http://www.666.baidu.com/index.html
    –>http://www.555.baidu.com/test.js
  3. 域名和域名ip http://www.baidu.com/index.html
    –>http://180.149.132.47/test.js

端口:

  1. http://www.baidu.com:8080/index.html–>
    http://www.baidu.com:8081/test.js
    协议:
  2. http://www.baidu.com:8080/index.html–>
    https://www.baidu.com:8080/test.js
    注:
     1、端口和协议的不同,只能通过后台来解决
     2、localhost和127.0.0.1虽然都指向本机,但也属于跨域

@CrossOrgin解决跨域问题

@CrossOrigin注解使用要求的环境配置
  1. Spring4.2+
spring注解@CrossOrigin不起作用的原因
  1. 版本问题,springMVC的版本不支持
  2. 非@CrossOrigin没有解决跨域请求问题,而是不正确的请求导致无法得到预期的响应,导致浏览器端提示跨域问题。
  3. 在Controller注解上方添加@CrossOrigin注解后,仍然出现跨域问题,解决方案之一就是:在@RequestMapping注解中没有指定Get、Post方式,具体指定后,问题解决。
常用属性

@CrossOrigin(origins,maxAge)

  1. origins 是一个字符串数组的类型(String []),用于表示那些域名可以访问此接口/映射。多个域名之间用逗号“,”隔开,如果想向所有网址开放,可以直接填写星号“*”,或者不填写此项。
  2. maxAge 被解释为“预请求的结果的有效期”,单位是秒。
代码

在Spring Boot中使用带有@CrossOrigin注释的controller方法CORS配置,不需要任何特定的配置。

@CrossOrigin注解可以单独在类上使用,也可以在方法上使用

public class LoginController {
    
    @Autowired
    UserService userService;

    @CrossOrigin
    @PostMapping(value = "/api/login")
    @ResponseBody
    public Result login(@RequestBody User requestUser){
            String username = requestUser.getUsername();
            username = HtmlUtils.htmlEscape(username);

            User user = userService.get(username,requestUser.getPassword());
            if(null == user){
                return new Result(400);
            }else{
                return new Result(200);
            }
    }
}

login方法跨域被所有的网站访问

@CrossOrigin可以同时在类上、方法上同时使用,来控制不同网站访问不同的映射,下面代码转载自

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("http://domain2.com")
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

remove方法可以被所有网站的访问,retrieve方法只接受http://domain2.com网站发送的请求。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐