【问题标题】:Crossorigin doesn't work跨域不起作用
【发布时间】:2018-12-05 21:55:38
【问题描述】:

React 让我说 Cross-Origin Request Blocked: The Same Origin Policy 不允许读取http://localhost:8080/users 的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。

奇怪的认为它对我有用并且它停止工作而没有对控制器代码进行任何更改......

UserController.java

@RestController
@CrossOrigin
@RequestMapping(value = "/users")
public class UserController {

@Autowired
private UserService userService;

@RequestMapping(value = "/{userId}", method = RequestMethod.GET)
private User findOne(@PathVariable("userId") Integer userId) {
    return userService.findOne(userId);
}

@RequestMapping(method = RequestMethod.GET)
private List<User> findAll() {
    return userService.findAll();
}

@RequestMapping(method = RequestMethod.POST)
private User create(@RequestBody User user) {
    user.setId(null); // To ensure we create instead of update
    return userService.save(user);
}

@RequestMapping(value = "/{userId}", method = RequestMethod.PUT)
private User update(@PathVariable("userId") Integer userId, @RequestBody User user) {
    user.setId(userId); // To ensure we update instead of create
    return userService.save(user);
}

@RequestMapping(value = "/{userId}", method = RequestMethod.DELETE)
private void delete(@PathVariable("userId") Integer userId) {
    final User user = userService.findOne(userId);
    userService.delete(user);
}
}

这是我对 React 的理解

 fetch('http://localhost:8080/users', {
    method: 'GET',
    headers: {
    'content-type': 'application/json'
  },
}).then(response => { return response.json();
}).then(data => {
  this.setState({users:data});
});
}

它突然停止工作的任何原因?

编辑:

我尝试制作一个干净的新maven项目并将所有包复制到新项目中,现在它可以工作了,但我仍然不知道它为什么停止工作,代码是一样的,现在它可以工作了。

【问题讨论】:

  • 对于 spring @CrossOrigin,默认 maxAge 为 30 分钟,尝试增加该值
  • 我没用,我做了一个新的 maven 项目并复制了所有文件,现在它可以工作了,所有代码都一样,所以我真的不知道发生了什么,我要去编辑主帖
  • 你是否改变了你的 spring 版本或类似的东西?
  • 不,我使用了相同的 maven 配置
  • 在 react 中,之前你使用 usr proxy 现在你在 fetch api 中使用完整路径,是这样吗?

标签: spring spring-mvc cors


【解决方案1】:

如果您使用 Spring Security 并希望在项目中全局使用 CORS,请尝试将其添加到配置中:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {

    httpSecurity
            .cors()
            .and()
            ........ other config

}

但在此之前尝试以下方法。要在类级别应用 CORS,请像这样使用它:

@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@Controller
public class SomeController{

}

或者像这样在方法级别使用它:

@CrossOrigin("http://example.com")
@RequestMapping("/some")
public Account retrieve() {
    // ...
}

@CrossOrigin(origins = "*")
@RequestMapping("/some")
public Account retrieve() {
    // ...
}

【讨论】:

  • 当我在每个函数上而不是在类的顶部使用@CrossOrigin 时,它又可以工作了。谢谢
  • 在您的案例中,在类级别和方法级别应用 @CrossOrigin 有什么区别,因此它适用于方法级别但不适用于类级别?
  • @Clay 如果您在类级别添加 crossOrigin,那么它将应用于该类中声明的每个映射。
  • @Sam 我知道,但在 JoseCarlosPB 的情况下,有什么区别,所以它不能在类级别上工作,而是在方法级别上工作?由于在类级别上应用 CrossOrigin 时 OPTIONS 请求不包含适当的标头?
  • @Clay Jose 编写的@CrossOrigin 注释没有origins = "*"。如果您进入 CrossOrigin 的实现,那么您会看到没有默认值。所以它不起作用。
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2018-03-07
  • 2014-04-18
相关资源
最近更新 更多