我在春季建造一个后端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;
}
}
免责声明
很明显,两种方法都可以允许一切。在开发过程中很好,但是在生产代码中使用时是一个可怕的主意!