Java 如何为CORS指定响应头?

Java 如何为CORS指定响应头?,java,angularjs,spring-boot,jwt,Java,Angularjs,Spring Boot,Jwt,我正在春季构建一个后端REST API,我的朋友正在构建一个Angular JS前端应用程序来调用我的API。我有一个带有keyAuthorization的令牌头和一个值,该值允许访问该服务,否则该服务将被拒绝。从邮递员和REST客户端,我可以接收API,但经过测试后,他说他获得了401个未经授权的权限飞行前出错。下面是我的doFilterInternal方法 protected void doFilterInternal(HttpServletRequest request, HttpServ

我正在春季构建一个后端REST API,我的朋友正在构建一个Angular JS前端应用程序来调用我的API。我有一个带有key
Authorization
的令牌头和一个值,该值允许访问该服务,否则该服务将被拒绝。从邮递员和REST客户端,我可以接收API,但经过测试后,他说他获得了401个未经授权的权限飞行前出错。下面是我的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时,他得到了

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

spring.mvc.dispatch options request=true

在application.properties.中,但错误似乎如下

飞行前的响应具有无效的https状态代码401


非常感谢您的帮助。

这可以帮助您,Spring有不同的方法来配置Cors头

既然你用
jwt
标记了你的问题,我几乎觉得有义务在spring boot和jwt上推荐这款出色的鞋款

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

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

我知道的最简单的方法是用
@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;

    }

}
@配置
公共类安全配置扩展了WebSecurity配置适配器{
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.cors();
}
@豆子
CorsConfiguration源CorsConfiguration源(){
UrlBasedCorsConfigurationSource;
source=新的UrlBasedCorsConfigurationSource();
CorsConfiguration配置=新的CorsConfiguration();
List all=Collections.singletonList(“*”);
配置。setAllowedOrigins(全部);
配置.setAllowedMethods(全部);
配置.setAllowedHeader(全部);
source.registerCorsConfiguration(“/**”,配置);
返回源;
}
}
免责声明


很明显,这两种方法都允许一切。这在开发过程中很好,但在生产代码中使用时却是一个糟糕的想法

以下是避免飞行前错误的过滤器

        @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);
            }        
        }

从帖子中找到它

现在它抛出了一个不同的错误,因为飞行前响应中的访问控制允许标头不允许访问控制允许原点。听起来像这个错误,在生产模式下应该采取什么解决方案?