java - 如何修复对预检请求的响应未通过访问控制检查 : No 'Access-Control-Allow-Origin' ?

标签 java spring api cors

我总是在前端遇到这种情况,说 Access to XMLHttpRequest at 'api/abc/xyz' from origin 'localhost://2800/api/abc/xyz' has been returned by CORS policy: Response to preflight request does not通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin” header 。

我尝试将其添加到后端 `

 http.authorizeRequests()
     .antMatchers(HttpMethod.OPTIONS).permitAll()
     .anyRequest().authenticated();

`

和我的前端 AJAX CALL API: `

$.ajax({
        'type': 'GET',
        'url': '/api/vessel/?vesselId=' + $('#vessel_id').val() + '&page=1&size=100',
        'headers': {
            "Content-Type": "application/json",
            "Accept": "application/json",
            "Authorization": `Bearer ${session}`
        },
        success: function(response) {console.log(response)}
 });

`

但之后我仍然遇到该错误。

`

@Override
    protected void configure(HttpSecurity http) throws Exception {

        // Disable CSRF (cross site request forgery)
        http.csrf().disable();

        // No session will be created or used by spring security
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        // Entry points
        http.authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS).permitAll()
                // Disallow everything else..
                .anyRequest().authenticated();


        // If a user try to access a resource without having enough permissions
        //http.exceptionHandling().accessDeniedPage("/login");

        // Apply JWT
        http.apply(new JwtTokenFilterConfigurer(jwtTokenProvider));

        // Optional, if you want to test the API from a browser
        // http.httpBasic();
    }

`

最佳答案

您必须配置 CORS 配置。在您的项目中添加以下类。您可以根据您的要求更改此设置。

WebConfig.java

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
public class WebConfig implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
      HttpServletResponse response = (HttpServletResponse) res;
      HttpServletRequest request = (HttpServletRequest) req;
      System.out.println("WebConfig; "+request.getRequestURI());
      response.setHeader("Access-Control-Allow-Origin", "*");
      response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
      response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With,observe");
      response.setHeader("Access-Control-Max-Age", "3600");
      response.setHeader("Access-Control-Allow-Credentials", "true");
      response.setHeader("Access-Control-Expose-Headers", "Authorization");
      response.addHeader("Access-Control-Expose-Headers", "responseType");
      response.addHeader("Access-Control-Expose-Headers", "observe");
      System.out.println("Request Method: "+request.getMethod());
      if (!(request.getMethod().equalsIgnoreCase("OPTIONS"))) {
          try {
              chain.doFilter(req, res);
          } catch(Exception e) {
              e.printStackTrace();
          }
      } else {
          System.out.println("Pre-flight");
          response.setHeader("Access-Control-Allow-Origin", "*");
          response.setHeader("Access-Control-Allow-Methods", "POST,GET,DELETE,PUT");
          response.setHeader("Access-Control-Max-Age", "3600");
          response.setHeader("Access-Control-Allow-Headers", "Access-Control-Expose-Headers"+"Authorization, content-type,"+
                  "access-control-request-headers,access-control-request-method,accept,origin,authorization,x-requested-with,responseType,observe");
          response.setStatus(HttpServletResponse.SC_OK);
      }

    } 
}
<小时/>
 @Override
    public void configure(WebSecurity web) throws Exception {
        web
          .ignoring()
            .antMatchers(HttpMethod.OPTIONS,"/**");
          //URL you want to ignore
    }

@Override
    protected void configure(HttpSecurity http) throws Exception {

        // Disable CSRF (cross site request forgery)
        http.csrf().disable();

        // No session will be created or used by spring security
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        // Entry points
        http.authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS,"/**").permitAll()
                // Disallow everything else..
                .anyRequest().authenticated();


        // If a user try to access a resource without having enough permissions
        //http.exceptionHandling().accessDeniedPage("/login");

        // Apply JWT
        http.apply(new JwtTokenFilterConfigurer(jwtTokenProvider));

        // Optional, if you want to test the API from a browser
        // http.httpBasic();
    }

关于java - 如何修复对预检请求的响应未通过访问控制检查 : No 'Access-Control-Allow-Origin' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56182426/

相关文章:

java - 即使将值分配给元素,输入数据也为空

java - 构建 Tensorflow Java Maven 依赖项以在内部 repo 中上传

java - 从单个主机注册 Spring Boot Eureka 客户端的多个实例

java - spring工具套件中无法更新以下项目的maven配置

安卓+ Facebook : where are API KEY and API SECRET used?

java - Android Studio 1.4 渲染问题 NOTE : This project contains Java compilation errors

java - 检测 Spring Boot/Java 配置应用程序的最佳方法

java - HttpServletRequest 详细信息使用 @Async Spring 返回 null

javascript - Spotify 应用程序 API : Creating a player of top tracks from an artist

c# - 使用 Restful asp.net Web api 和安全 API 进行用户登录身份验证