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

启用CORS支持Spring Boot

阮轶
2023-03-14

我试图在Spring Boot应用程序中启用CORS支持,但没有成功。我研究了很多解决方案,但似乎都不适合我。

当我尝试从Angular应用程序呼叫Java后端时,我在chrome中看到了错误:

CORS策略阻止从源http://localhost:4200在http://localhost:8080/..处访问XMLHttpRequest:对预检请求的响应不通过权限改造检查:不允许对预检请求进行重定向。

我已经通过添加以下注释在控制器方法级别启用了CORS,但我仍然得到预飞行请求错误。

@CrossOrigin(origins = "http://localhost:4200")

我的Spring Security配置:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/**");
    }
}

我的自定义过滤器:

@Configuration
public class AuthFilter implements Filter {

    @Autowired
    private Environment env;
    
    private static final ApplicationLogger logger = ApplicationLogger.getInstance();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.debug("Initializing authentication filter.");

    }
    
    public boolean checkHeader(HttpServletRequest httpRequest) {
        boolean flag = false;

        String applicationName = httpRequest.getHeader("bar");
        if (applicationName != null && applicationName.equalsIgnoreCase("foo")) {
            flag = true;
        }
        return flag;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        // HttpSession httpSession = httpRequest.getSession();
        List<String> excludedUrls = null;
        String excludePattern = env.getProperty("excludedUrls");
        excludedUrls = Arrays.asList(excludePattern.split(","));

        String path = ((HttpServletRequest) request).getServletPath();

        String loginPathURL = env.getProperty("loginPathURL");

        if (excludedUrls.contains(path) 
                || path.contains("/file/..")
                || path.contains("/file/...")
                || path.contains("/file/....")) {  
            chain.doFilter(request, response);
        } else if (checkHeader(httpRequest)) {
            // Authenticate the request through LDAP
            logger.info("Authenticating the request ...");
            chain.doFilter(request, response);
        } else {
            logger.debug("User is not authenticated");
            httpResponse.sendRedirect(loginPathURL);
        }
        
    /*  
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpSession httpSession = httpRequest.getSession();

        List<String> excludedUrls = null;
        String excludePattern = env.getProperty("excludedUrls");
        excludedUrls = Arrays.asList(excludePattern.split(","));

        String path = ((HttpServletRequest) request).getServletPath();

        if (excludedUrls.contains(path)) {
            // Authenticate the request through LDAP
            logger.info("Authenticating the request ...");
            chain.doFilter(request, response);
        }
        
        else if(checkHeader(httpRequest)) {
    
        else if (httpSession != null && httpSession.getAttribute(WorkpermitConstants.CLIENT_AUTH_TOKEN_KEY) != null) {
            
            List<Map<String,Object>>  res = (List<Map<String,Object>>)  jdbcTemplate.queryForList("some select query") ;
            
            if(!AppUtil.isObjectEmpty(res.size())) {
            
                for (Map<String, Object> row : res) {
                    
                    //currentUserEmail
                    //empType
                    //userId
                    //username
                }
            }
            
            chain.doFilter(request, response);
        } else {
            logger.debug("User is not authenticated.");
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            //httpResponse.sendRedirect(httpRequest.getContextPath() + "/");
            
            httpResponse.sendRedirect("http://..");
        }
    */
        // comment below code
        // chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }
}

在研究了一些解决方案后,我在我的类中添加了以下代码,但它也不适合我。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/**");
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST","OPTIONS"));
        // NOTE: setAllowCredentials(true) is important,
        // otherwise, the value of the 'Access-Control-Allow-Origin' header in the response
        // must not be the wildcard '*' when the request's credentials mode is 'include'.
        configuration.setAllowCredentials(true);

        // NOTE: setAllowedHeaders is important!
        // Without it, OPTIONS preflight request will fail with 403 Invalid CORS request
        configuration.setAllowedHeaders(Arrays.asList(
                "Authorization",
                "Accept",
                "Cache-Control",
                "Content-Type",
                "Origin",
                "ajax", 
                "x-csrf-token",
                "x-requested-with"
        ));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

Spring启动版本:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

共有2个答案

柴彬
2023-03-14

@CrossOrigin注释添加到以下任一项:

>

  • 控制器方法级别-这仅限制/启用此特定方法的跨域资源共享。

    @交叉原点(原点=”http://localhost:4200")

    全球CORS

    public WebMvcConfigurer corsConfigurer() {
      return new WebMvcConfigurer() {
          @Override
          public void addCorsMappings(CorsRegistry registry) {
              registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:8080");
          }
      };
    }
    

    注意:在origin中共享完整的URL(带有http://)很重要

    有关更多信息,请参阅:https://spring.io/guides/gs/rest-service-cors/

  • 齐驰
    2023-03-14

    在main方法上添加@CrossOrigin("http://localhost:4200"),如果您希望它用于特定的控制器,请在控制器上添加注释。

     类似资料:
    • 20.CORS 支持 20.1简介 出于安全考虑,浏览器禁止AJAX调用驻留在当前来源之外的资源。 例如,当您在一个标签中检查您的银行帐户时,您可以在另一个标签中打开evil.com网站。 evil.com的脚本不能使用您的凭据向您的银行API发出AJAX请求(例如,从您的帐户中提款)! Cross-origin resource sharing(CORS) 是大多数浏览器实现的W3C规范,允许您

    • 问题内容: 我有一个使用restify模块创建的REST api,我想允许跨域资源共享。最好的方法是什么? 问题答案: 您必须将服务器设置为设置跨源标头。不知道是否有内置的使用功能,所以我写了自己的功能。 我是从本教程中找到的。http://backbonetutorials.com/nodejs-restify-mongodb- mongoose/

    • 我正在尝试使用NetBeans(或任何IDE)开发JavaFX应用程序,但我无法正确安装JDK和JavaFX。 对于上下文,我使用Ubuntu 18.04 LTS,并遵循本指南。目前,当运行时,我得到以下输出: 这不是我想要使用的JDK。我已经从这个网站下载了JDK15,打开了tar。gz文件,并将其放入名为的文件夹中的。提取文件夹后,我将JDK添加到我的系统路径变量中: 然后是系统重启。在Net

    • 我正在使用Jhipster来生成API。 在Spring boot中还需要做什么来启用CORS吗?

    • 如CORS中所述,preflight请求由于标准头而失败,如果您将请求发送到endpoint,并设置了和头,那么它们将被Spring框架截获,并且您的方法不会得到执行。接受的解决方案是使用注释来阻止Spring返回。但是,我正在使用Swagger Codegen生成API代码,所以我只想禁用它,并手动实现我的响应。 那么你能在Spring禁用CORS拦截吗?