如何指定CORS的响应标题



我在春季建造一个后端REST API,我的朋友正在构建一个Angular JS前端应用程序来打电话给我的API。我有一个带有键Authorization的令牌标题从邮递员和休息客户端,我能够收到API,但是在经过测试时,他说他在preflight上获得401个未经授权的错误。BELOW是我的dofilterinternalthern方法。

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 J的令牌打电话给API时,他会得到

所以我在这里遵循此答案,然后添加了属性

spring.mvc.dispatch-options-request=true

在应用程序中。

preflight的响应无效HTTPS状态代码401

任何帮助都将不胜感激。

这是避免前飞行错误

的过滤器
        @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);
            }        
        }

从邮政杂交的请求中找到了它,阻塞了弹簧MVC RESTFULFULANJS

这可以帮助您,春季有不同的方式配置CORS标题https://spring.io/guides/gs/rest-service-cors/

由于您用jwt标记了问题,因此我几乎有义务在Spring Boot和JWT上提出这种出色的演示。

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

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

我知道的最简单方法是用@CrossOrigin("*")

注释RestController

第二个选项是配置具有弹簧安全的COR:

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

免责声明

很明显,两种方法都可以允许一切。在开发过程中很好,但是在生产代码中使用时是一个可怕的主意!

最新更新