我有一个在8888端口上运行的Spring Boot后端应用程序和一个在4200端口上运行的Angular前端应用程序。
在我的Spring Boot应用程序中,我定义了以下bean来处理CORS:
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
};
}
我的HttpSecurity
配置如下所示:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf().disable()
// ... the rest of the config
}
通过这种配置,一切正常,我可以从Angular应用程序成功调用我的API。
但我想启用CSRF,所以我将安全配置更改为:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
// ... the rest of the config
}
我在Angular应用程序中添加了以下HttpInterceptor
:
constructor(private tokenExtractor: HttpXsrfTokenExtractor) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = this.tokenExtractor.getToken();
if (token) {
req = req.clone({ setHeaders: { 'X-XSRF-TOKEN': token } });
}
return next.handle(req);
}
问题是令牌提取器。getToken()
始终返回null
。
相应的请求和响应头如下所示:
存在XSRF-TOKEN
响应cookie。
我不明白问题出在哪里。
我尝试在Angular应用程序中导入HttpClientXsrfModule
,但没有任何区别。
我真的很感激你的建议。
正如文档中所说,[…您可以在单个控制器或全球范围内启用跨源资源共享(CORS)…]
@Configuration
public class CorsConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer(){
return new WebMvcConfigurer(){
@Override
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*").maxAge(3600);
}
};
}
}
我在我的Spring Boot应用程序中使用了这段代码,它对Angular应用程序非常有效
@组件公共类SimpleCORSFilter实现过滤器{
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("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, remember-me");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
希望有帮助:)
不需要。你可以使用chrome nosecurity或安装Allow Control Allow Origin插件来解决问题。
我试图从一个应用程序(spring-boot应用程序)调用另一个应用程序(angularjs)上的RESTendpoint。应用程序正在下列主机和端口上运行。 REST应用程序,使用Spring Boot, HTML应用程序,使用angularjs, 处理程序所做的只是根据用户是否登录、身份验证失败或注销,写出类似的JSON响应。如下所示。 对我错过了什么或者做错了什么有什么想法吗?
我在我的Spring Boot应用程序中使用JWT。当我试图从Angular 6客户端登录时,我得到了CORS错误 我尝试为添加标题,甚至尝试使用一些chrome扩展,但仍然无法绕过CORS。我可以使用Postman访问登录API,并获得令牌。 Spring引导类 下面是我如何发出post请求来登录,这给了我一个错误 还有Angular中的接口
我在下面的链接中添加了过滤器作为问题的答案 Spring Boot Data Rest+CORS不能正确启用选项/删除
null 你有什么推荐?另外,当我选择其中一个选项时,configure project是否可以将angular源文件导出到可部署的JAR文件中?谢谢你的忠告。
我想做一些spring boot应用程序。我已经创建了spring boot项目,但我有一个问题。我的控制器看起来像: 但我看到的并不是索引。html,但只有一个单词“index”。所以我想用角度。 和控制器: 我的索引。html 但它不起作用,我只在本地主机上看到错误。 如何使这个角度控制器正常工作并返回正确的视图?
我使用Spring引导1.3.3和黑兹尔卡斯特我的构建看起来像: 当服务在Linux执行时,我在日志中看到: 但我在油罐里看到hazelcast-all.jar有线索吗?