Java 如何为CORS指定响应头?
我正在春季构建一个后端REST API,我的朋友正在构建一个Angular JS前端应用程序来调用我的API。我有一个带有keyJava 如何为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
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);
}
}
从帖子中找到它现在它抛出了一个不同的错误,因为飞行前响应中的访问控制允许标头不允许访问控制允许原点。听起来像这个错误,在生产模式下应该采取什么解决方案?