如何为CORS指定响应头?

时间:2017-11-30 01:54:18

标签: java angularjs spring-boot jwt

我正在构建一个后端REST API,我的朋友正在构建一个Angular JS前端应用来调用我的API。我有一个带有键Authorization的令牌头和一个可以访问服务的值,否则它拒绝。从Postman和REST客户端我能够收到API但是在测试时他说他在预检时获得了401 Unauthorized Error.Below是我的doFilterInternal方法。

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers","Content-Type, Accept, X-Requested-With, Authorization");
}

但是当他用Angular JS中的令牌调用API时,他得到了

所以我按照这个答案here添加了属性

spring.mvc.dispatch-options-request=true

在application.properties中的

。但是他的错误似乎是

预检的响应包含无效的https状态代码401

感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

这是避免预检错误的过滤器

        @Override
        protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException {
            LOG.info("Adding CORS Headers ........................");        
            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);
            }        
        }

从帖子Cross Origin Request Blocked Spring MVC Restful Angularjs

找到它

答案 1 :(得分:2)

这可以帮助你,Spring有不同的方式来配置Cors头 https://spring.io/guides/gs/rest-service-cors/

答案 2 :(得分:1)

由于您使用jwt标记了您的问题,因此我几乎觉得有必要在spring boot和jwt上建议这个优秀的demo

该项目包括一些有用的安全配置。

不幸的是,它没有配置cors,但这里有两种快速解决问题的方法:

我所知道的最简单方法是使用RestController

注释@CrossOrigin("*")

第二个选项是使用spring security配置cors:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure (HttpSecurity http) throws Exception {
         http.cors();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource () {

        UrlBasedCorsConfigurationSource source;
        source = new UrlBasedCorsConfigurationSource();

        CorsConfiguration configuration = new CorsConfiguration();
        List<String> all = Collections.singletonList("*");
        configuration.setAllowedOrigins(all);
        configuration.setAllowedMethods(all);
        configuration.setAllowedHeaders(all);

        source.registerCorsConfiguration("/**", configuration);
        return source;

    }

}

<强>声明

很明显,这两种方法都可以实现一切。在开发过程中没问题,但在生产代码中使用时却很糟糕!