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

如何在localhost上启用Spring和角度2之间的CORS

漆雕奇
2023-03-14

我有一个在Spring版本4.3.4上使用Java后端的老项目。发布和Spring Security版本4.2.2。释放没有办法更新这些库,我必须使用现有的库。该项目不是REST API,没有RestController或WebMVCConfiguer。所以,我按照这里的建议配置了cors:

@EnableWebSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    protected SecurityConfiguration() {
        super();
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                // we don't need CSRF because our token is invulnerable
                .csrf().disable()

                // don't create session
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()

                .authorizeRequests()

                // allow anonymous resource requests
                .antMatchers(HttpMethod.GET,
                        "/",
                        "/*.html",
                        "/favicon.ico",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js")
                .permitAll()
                .antMatchers(HttpMethod.POST, "/rpc/*").permitAll()
                .anyRequest().permitAll();

        httpSecurity.addFilterBefore(new CorsFilter(), ChannelProcessingFilter.class);

        // disable page caching
        httpSecurity.headers().cacheControl();
    }
}

Cors过滤器:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter extends OncePerRequestFilter {

    private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CorsFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        logger.error("CORS filter: " + request.getMethod());
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With, xsrf-token");
        response.addHeader("Access-Control-Expose-Headers", "xsrf-token");
        if ("OPTIONS".equals(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            filterChain.doFilter(request, response);
        }
    }
}

在网上。xml在所有上下文参数之后和列表器之前(这是应用程序中唯一的过滤器):

   <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>web.servlet.response.CorsFilter
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

我在localhost:8080上运行后端,在localhost:8081上运行前端。然而,当我试图发送包含application/json的POST请求时,浏览器控制台中出现了一个错误

Access to XMLHttpRequest at 'http://localhost:8080/rpc' from origin 'http://localhost:8081' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

此外,我希望在后端看到日志“CORS过滤器: POST”,我把它放在那里检查它是否会进入过滤器,但是没有这样的日志。

请问,有什么建议说明为什么它不起作用吗?我需要在请求中坚持使用application/json,而且有时在应用程序中也有一个授权头,所以不能完全避免cors。这会是一个角度2的问题吗?

共有2个答案

崔单弓
2023-03-14

此错误是拒绝选项web方法的结果,因此应在configure方法中添加以下语句:

.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()

就像这样:

httpSecurity
            // we don't need CSRF because our token is invulnerable
            .csrf().disable()

            // don't create session
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()

            .authorizeRequests()

            // allow anonymous resource requests
            .antMatchers(HttpMethod.GET,
                    "/",
                    "/*.html",
                    "/favicon.ico",
                    "/**/*.html",
                    "/**/*.css",
                    "/**/*.js")
            .permitAll()
            .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
            .antMatchers(HttpMethod.POST, "/rpc/*").permitAll()
            .anyRequest().permitAll();
洪浩
2023-03-14

我不熟悉spring或java,但我认为我理解这个问题。

我假设您的日志过滤器不起作用,因为spring framework在执行过滤器之前短路了该请求。

这里的问题可能在配置中的某个地方,但我认为解决给定问题的方法总体上是不正确的。

CORS是为某些目的而创建的,通过允许来自所有其他来源的浏览器请求,您实际上会产生一些潜在的安全问题。

理想情况下,如果“服务器”和“客户端”都是你的应用程序,那么从客户端,你应该只向托管客户端应用程序的同一来源发出请求。因此,在本地情况下,它应该向localhost:8081发出请求,您可以在发出请求时省略客户端的主机基址。

为了让它工作,对于开发环境,最好的选择是为角设置代理(从localhost:8081localhost:8080的代理请求),详细的设置信息在这里。

对于生产环境,您需要在同一来源上托管后端服务器/客户端应用程序。你可以通过在你的后端服务器/客户端web服务器前面安装一些代理服务器,或者直接在你的后端服务器上托管客户端应用程序(角度静态输出文件)。

另一种选择是执行您尝试执行的操作,但不允许来自所有来源的请求(不是.permitAll()),而是列出特定的允许来源(如localhost:8081)。但它并没有那么干净,而且您需要为开发环境和生产指定不同的来源。

 类似资料:
  • 问题内容: 我正在学习角度。我不明白onLoad和ng-init之间的变量初始化有什么区别。它在哪个范围内创建此变量。 也请给我一些关于隔离范围的想法。 问题答案: 是,可以放置内的指令的,的,不管,而是一个属性特定于指令其功能如同一个。要了解我的意思,请尝试以下操作: 您会看到只有第二个出现。 隔离范围是一个原型,它不从其父范围继承。用外行的术语来说,如果您有一个小部件不需要任意读写父作用域,则

  • 我正在尝试使用Spring Security(4.1.3)和Angular 2.0.1实现CSRF保护 相关话题的来源很多,但我找不到明确的说明。有些说法甚至相互矛盾。 我读过关于springs的操作方法(尽管指南中描述了Angular 1 way)Spring Security guide,其中包含Angular,即

  • 我有一个在8888端口上运行的Spring Boot后端应用程序和一个在4200端口上运行的Angular前端应用程序。 在我的Spring Boot应用程序中,我定义了以下bean来处理CORS: 我的配置如下所示: 通过这种配置,一切正常,我可以从Angular应用程序成功调用我的API。 但我想启用CSRF,所以我将安全配置更改为: 我在Angular应用程序中添加了以下: 问题是始终返回。

  • 我试图连接到Cassandra从我的Spring Boot应用程序使用Spring Boot数据cassandra。我有两个疑问。 1)是否建议使用CassandraAutoConfiguration,即在application.properties中提供带有前缀(spring.data.cassandra.*)的所有Cassandra配置,以便我的应用程序为我创建一个集群,或者我需要手动创建集群

  • 我对可观察量很陌生。如何仅从一个简单的字符串创建可观察的?然后订阅它并在它发生变化时输出它。 这有意义吗? 我在谷歌搜索上一点运气都没有。可能是错误的关键字? 添加一些代码以更好地解释: 我想我在这里做错了什么?但不知道怎么问。我将不胜感激的任何解释。

  • > 到目前为止,我使用角2快速入门创建了一个新项目。 我决定开始使用angular 2 cli,并创建了一个新的angular 2 cli项目。 移动了我的所有文件并重新安装了所有软件包。 现在,当我试图在CLI项目中使用角2材料时,我遵循了这里的指南,但这是我得到的: 会出什么问题?