当前位置: 首页 > 知识库问答 >
问题:

处理Spring靴和角形靴之间的CORS和CSRF

慎兴业
2023-03-14

我有一个在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,但没有任何区别。

我真的很感激你的建议。

共有3个答案

盖锦程
2023-03-14

正如文档中所说,[…您可以在单个控制器或全球范围内启用跨源资源共享(CORS)…]

  • 控制器方法CORS配置:可以使用@CrossOrigin注释启用
  • 全局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);

            }
        };
    }
}

夏振国
2023-03-14

我在我的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() {
}

希望有帮助:)

劳彦
2023-03-14

不需要。你可以使用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有线索吗?