【问题标题】:How to enable CORS properly in Spring Restfull WebService?如何在 Spring Restful Web Service 中正确启用 CORS?
【发布时间】:2015-12-11 19:10:15
【问题描述】:

我试图实现的是在另一个域中使用我的 spring restful web 服务,但是当我执行生成 JSON 值的 json url 时,我的 javascript 控制台会生成此错误:

跨域请求被阻止:同源策略不允许读取位于http://localhost:8080/SpringServiceJsonSample/service/updatepool/1 的远程资源。 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。 跨域请求被阻止:同源策略不允许读取位于http://localhost:8080/SpringServiceJsonSample/service/updatepool/1 的远程资源。 (原因:CORS 请求失败)。

这是我通过这些链接生成的 JSON 值http://localhost:8080/SpringServiceJsonSample/service/updatepool/1

{"userid":1,"firstName":"brand","lastName":"bennet","email":"benjie@gmail.com"}

这是我的 SpringController.java :

@RestController
@RequestMapping("/service/updatepool/")
public class SpringServiceController {

    UserService userService = new UserService();

    @RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
    public User getUser(@PathVariable int id) {
        User user=userService.getUserById(id);
        return user;
    }
}

然后我创建了基于 spring.io 的 SimpleCORSFilter 教程,所以这是我的 SimpleCORSFilter.java 类

@Component
public class SimpleCORSFIlter implements Filter{

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}
}

这是我使用 JSON 值的方式,首先我创建 index.html 文件,它看起来像 index.html

<html ng-app>
<head>
<title>Angular Test</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>
<script src="app.js"></script>
</head>
<body>
    <div ng-controller="Hello">
        <p>User ID : {{greeting.userid}}</p>
        <p>firstName : {{greeting.firstName}}</p>
        <p>lastName : {{greeting.lastName}}</p>
        <p>email : {{greeting.email}}</p>

    </div>
</body>
</html>

这是我的 app.js

function Hello($scope, $http) {
    $http.get('http://localhost:8080/SpringServiceJsonSample/service/updatepool/1').
        success(function(data) {
            $scope.greeting = data;
        });
}

我已经创建了 CORS 过滤器类,为什么它仍然给我 CORS 阻塞错误?我错过了什么?我不认为该类工作正常,我必须如何跟踪错误?

【问题讨论】:

  • 您的自定义过滤器“SimpleCORSFIlter”需要在您的 web.xml 文件中注册。
  • @BillBilal 怎么注册?

标签: json web-services spring-mvc cors


【解决方案1】:

前段时间,我在使用类似的 REST 服务器时遇到过类似的 CORS 问题。标头是在 REST 服务器的基类中设置的,但它似乎不起作用。我能够修复它的唯一方法是将以下行添加到我的 .htaccess 文件中。

<ifModule mod_headers.c>
    Header always set Access-Control-Allow-Origin: "*"
    Header always set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS"
    Header always set Access-Control-Allow-Headers "X-Requested-With, content-type"
</ifModule> 

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

【讨论】:

  • 我不使用 .htaccess 文件。你使用java spring mvc技术吗?我从没听过那个文件,但我确实有很多 xml 文件
  • 我想您的 REST WebService 位于服务器上的某个位置,以便通过 Web 访问它。通常在服务器的 public_html 目录中有一个 .htaccess 文件。如果没有,您可以创建一个。
【解决方案2】:

就像@Bill Bilal 所说,我必须将它注册到我的 web.xml,所以这就是我如何在我的 web.xml 中注册它

<filter>
  <filter-name>cors</filter-name>
  <filter-class>com.myapp.springservice.utility.SimpleCORSFIlter</filter-class>
</filter>
<filter-mapping>
  <filter-name>cors</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

【讨论】:

  • 我没有看到你的问题,很高兴你找到了。不要忘记选择它作为接受的答案。
【解决方案3】:

您可以使用此过滤器解决您的问题。它适用于 Spring Restful

public class CORSFilter extends OncePerRequestFilter {

    private final Logger LOG = LoggerFactory.getLogger(CORSFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException {      
        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        res.setHeader("Access-Control-Max-Age", "3600");
        res.setHeader("Access-Control-Allow-Headers", "X-PINGOTHER,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization");
        res.addHeader("Access-Control-Expose-Headers", "xsrf-token");
        if ("OPTIONS".equals(req.getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
        } else { 
            chain.doFilter(req, res);
        }        
    }
}

我在帖子angularjs spring cross-origin request blocked上找到了这个

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 2023-03-12
    • 2015-09-14
    • 2016-02-14
    • 2013-09-26
    • 2018-10-15
    • 2017-02-21
    • 2020-03-20
    • 2018-08-30
    相关资源
    最近更新 更多