@CrossOrigin解决跨域问题

跨域

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

  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网站发送的请求。

回答: 不完全正确。@CrossOrigin注解可以解决本地问题,但在某些情况下可能会遇到一些限制。引用中的报错信息指出,当设置allowCredentials为true时,allowedOrigins不能包含特殊值"*",因为在"Access-Control-Allow-Origin"响应头中不能设置"*"。解决方案是明确列出允许使用credentials的origins,或者考虑使用"allowedOriginPatterns"代替。此外,引用提到除了细粒度、基于注释的配置之外,可能还需要定义一些全局CORS配置。这些配置可以在Spring MVC中声明,并结合细粒度的@CrossOrigin配置。默认情况下,所有origins和GET、HEAD和POST方法都是被允许的。因此,@CrossOrigin可以解决本地问题,但在一些特殊情况下可能需要额外的配置。举个例子,可以在控制器类上使用@CrossOrigin注解来允许访问,并在请求方法上使用@RequestMapping注解来定义具体的请求路径和方法类型。例如: ```java @CrossOrigin @RestController public class PersonController { @RequestMapping(method = RequestMethod.GET) public String add() { // 执行相关操作 } } ```<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [解决springboot添加@CrossOrigin支持不起作用](https://blog.csdn.net/qq_45721173/article/details/124634565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [注解@CrossOrigin解决问题](https://blog.csdn.net/qq_39176597/article/details/112982244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值