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

Tomcat 8和Spring Security Cors

霍建柏
2023-03-14

我正在尝试配置Spring Security性,使其支持CORS。多亏了这篇文章,Spring security CORS Filter,我已经使用Spring Boot在本地主机上运行了,配置代码如下:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors()
        .and()
        .antMatcher("/api/**")
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .authorizeRequests()
        .antMatchers(HttpMethod.POST, "/api/login").permitAll()
        .antMatchers(HttpMethod.GET, "/api/websocket/**").permitAll()
        .antMatchers("/api/**").authenticated()
        .and()
        .addFilterBefore(new JWTLoginFilter("/api/login", HttpMethod.POST, authenticationManager(), tokenAuthenticationService, myUserService), UsernamePasswordAuthenticationFilter.class)
        .addFilterBefore(new JWTAuthenticationFilter(tokenAuthenticationService), UsernamePasswordAuthenticationFilter.class)
        .csrf().disable();
    }

@Bean
public CorsConfigurationSource corsConfigurationSource() {
    final CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(ImmutableList.of("*"));
    configuration.setAllowedMethods(ImmutableList.of("HEAD",
            "GET", "POST", "PUT", "DELETE", "PATCH"));
    // 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);
    // setAllowedHeaders is important! Without it, OPTIONS preflight request
    // will fail with 403 Invalid CORS request
    configuration.setAllowedHeaders(ImmutableList.of("Authorization", "Cache-Control", "Content-Type"));
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

}

但是当我在远程Tomcat服务器上部署我的应用程序时,它不起作用:

 Access to XMLHttpRequest at 'http://xxx:9080/yyy/api/user/findByLogin/?login=zzz' from origin 'http://xxx:10080' 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.

我的配置类是否足够,还是需要在Tomcat设置中设置一些内容?谢谢你们

共有3个答案

轩辕阳焱
2023-03-14

检查tomcat服务器是否在$CATALINA_BASE/conf/web中配置了冲突的CORS过滤器。xml

刘子实
2023-03-14

Tomcat也有自己的cors过滤器,如果您在Tomcat之前使用其他服务器(如nodejs、apache服务器vs),也要检查它的cors过滤器。

董意蕴
2023-03-14

Spring security提供了一种在http configurer中配置CORS的方法,有一种更干净的方法将CORS过滤器添加到应用程序中-

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyCORSFilterClass implements Filter {
@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() {
}
}

排序具有最高优先级的过滤器确保MyCORSFilterClassimementation的javax.servlet.过滤器是链中的第一个。

 类似资料:
  • 我的项目是在Windows-SpringIDE-TomcatV8上进行的。0用于windows,MySql5。该项目还涉及java7、Tomcat7。我所有的课都是自动注释的。问题是,当我在Centos上部署project时,我有java8、Tomcat8和一个异常。请提出一些解决问题的建议。 以下是linux上的例外情况: 组织。springframework。豆。工厂BeanCreationE

  • 我正在使用Vagrant部署到Ubuntu Linux,并尝试启动服务。 然后我跟踪,发现: ?tomcat8.service-lsb:启动tomcat。加载:加载(/etc/init.d/tomcat8) active:失败(结果:exit-code)自2016-03-28 09:44:17 GMT;5s前 文档:人:systemd-sysv-generator(8) 进程:884 execst

  • 我正在将tomcat服务器从tomcat7升级到Tomcat8。但Struts1.1似乎不能在Tomcat8上工作。有人知道Tomcat8不支持Struts1.1吗。 下面是堆栈跟踪

  • 我使用EC2 amazon linux+Java1.8+Tomcat8。安装程序如下: 但是我的spring mvc示例程序不工作,Tomcat8的示例程序也不工作。 我不知道为什么。请帮帮我

  • https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat8-maven-plugin 当我使用运行时,我得到以下错误: 但是,rt.jar确实存在,并且我的JAVA_HOME环境设置正确: MVN-V Apache Maven 3.3.9(BB52D8502B132EC0A5A3F4C09453C07478323DC5;20

  • 本文向大家介绍docker安装tomcat8的实现方法,包括了docker安装tomcat8的实现方法的使用技巧和注意事项,需要的朋友参考一下 一、docker安装tomcat8 1、查找Docker Hub上的tomcat镜像 2、拉取tomcat镜像 3、使用tomcat默认的配置来启动一个tomcat容器 4、拷贝容器内tomcat配置文件和日志到本地准备映射 5、停止tomcat,并删除容

  • 我已经安装了Tomcat7和8,但是如果我进入服务器选项卡并单击Create new Server,我会发现:它既不允许我插入服务器名称,也不允许我单击Finish。

  • 解释我症状的最接近stackoverflow的问题是:如何在Tomcat7中部署Grails 3.0.1 war文件? 我正在将Grails 2.3.4应用程序升级到Grails 3.1.10,一切都在使用“Grails run app”。 当我部署到一场战争中时,任何url都只能得到404。 战争在卡塔利纳部署时没有任何错误信息。出来 tomcat访问日志显示了我的访问尝试。(不是linux问题