【问题标题】:CORS origin is not working in Spring boot with Javax servlet Webfilter使用 Javax servlet Webfilter 在 Spring Boot 中 CORS 起源不起作用
【发布时间】:2021-02-01 13:52:59
【问题描述】:

我用 java 和 spring boot 创建了一个 Rest API。

使用javax.servlet.annotation.WebFilter 来检查身份验证。它工作正常,但面临

Access to XMLHttpRequest at 'http://localhost:8080/api/' from origin 'null' has been blocked by CORS policy

问题所以我在我的@RestController class 中使用@CrossOrigin(origins = "*")

当我尝试从我的前端应用程序访问我的 rest api 时,它在浏览器控制台中显示 CROS policy 错误并在服务器控制台中显示 401 错误。

当我删除 @WebFilter 注释时,CROS 原点工作正常。

我该如何解决这个问题。

我的代码

春季启动版

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

Controller.java

@RestController
@CrossOrigin(origins = "*")
@RequestMapping(value = "api")
public class Controller  {

}

Application.java

@SpringBootApplication
@ServletComponentScan
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

LoginHandleFilter.java

@WebFilter(description = "登录和编码过滤器", urlPatterns = {"/api/*"}) 公共类 LoginHandleFilter 实现过滤器 {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    String token = request.getHeader("Authorization");
    if(isAuthenticate(token)){
        chain.doFilter(request, response);
    }else{
        response.sendError(401);
    }
}

@Override
public void destroy() {
}

private boolean isAuthenticate(String token){
    return token.equals("Mytoken");
}

}

javascript

var http = new XMLHttpRequest():
http.open("GET", "http://localhost:8080/api/", true);
http.setRequestHeader("Authorization", "TOKEN");
http.onreadystatechange = function(){

}
http.send();

我错过了什么吗?

【问题讨论】:

标签: java spring-boot


【解决方案1】:

添加此配置类。如果您已经有 WebMvcConfigurer,只需添加 addCorsMappings 方法。然后应该读取通过 CrossOrigin 注释提供的 cors 配置,并将必要的标头 Access-Control-Allow-Origin 添加到响应标头中。

@Configuration
public class MyConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 2019-10-25
    • 2020-03-23
    • 1970-01-01
    • 2013-04-18
    • 2021-07-31
    相关资源
    最近更新 更多