【问题标题】:Spring Boot multiple servlets errorSpring Boot多个servlet错误
【发布时间】:2015-08-24 21:34:46
【问题描述】:

我的 Spring Boot 应用程序中有两个通过 uri 映射的 servlet, 一个映射到 /local/* 到 DispatcherServlet,另一个 /* 映射到 VaadinServlet 但是当我尝试通过 /local/blabla 访问某些内容时,也会调用 VaadinServlet。

在我的 JBoss 应用程序中不会发生这种情况,是否需要在 Spring Boot 中设置任何配置?

我注意到另一个问题,为什么要映射到“/”?我可以禁用它吗,因为我不需要使用这个 uri。

例如: https://localhost:9043/test/local/userRemote

@Bean
public ServletRegistrationBean vaadinServletRegistrationBean() {
    final ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new SpringVaadinServlet(),
            "/*");
    servletRegistrationBean.setOrder(10);
    return servletRegistrationBean;
}

@Bean
public ServletRegistrationBean servletRegistrationBean(final DispatcherServlet dispatcherServlet) {
    final ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet);
    servletRegistrationBean.addUrlMappings("/local/*");
    servletRegistrationBean.setOrder(5);

    return servletRegistrationBean;
}
日志
015-06-09 18:24:15.063  INFO 5344 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'portalPersistenceUnit'
2015-06-09 18:24:17.700  INFO 5344 --- [           main] o.s.s.web.DefaultSecurityFilterChain     : Creating filter chain: Ant [pattern='/local/*'], [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@615c6a, org.springframework.security.web.context.SecurityContextPersistenceFilter@1060020, org.springframework.security.web.header.HeaderWriterFilter@6a5659, org.springframework.security.web.authentication.logout.LogoutFilter@261998, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@3b6765, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@a72925, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@62c887, org.springframework.security.web.session.SessionManagementFilter@fabf06, org.springframework.security.web.access.ExceptionTranslationFilter@19a2203, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@ab398b]
2015-06-09 18:24:17.701  INFO 5344 --- [           main] o.s.s.web.DefaultSecurityFilterChain     : Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@1c5d1f, org.springframework.security.web.context.SecurityContextPersistenceFilter@47637c, org.springframework.security.web.header.HeaderWriterFilter@18ab988, org.springframework.security.web.authentication.logout.LogoutFilter@12afc39, org.springframework.security.web.authentication.logout.LogoutFilter@1df7359, org.jasig.cas.client.session.SingleSignOutFilter@2498a3, org.springframework.security.cas.web.CasAuthenticationFilter@c2f767, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@6f0f70, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@53ac0c, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@7ab205, org.springframework.security.web.session.SessionManagementFilter@c475ba, org.springframework.security.web.access.ExceptionTranslationFilter@59c3ff, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@14f2020]
2015-06-09 18:24:17.763  INFO 5344 --- [           main] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/local/*]
2015-06-09 18:24:17.763  INFO 5344 --- [           main] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'springVaadinServlet' to [/*]
2015-06-09 18:24:17.763  INFO 5344 --- [           main] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2015-06-09 18:24:17.763  INFO 5344 --- [           main] o.s.b.c.e.ServletRegistrationBean        : Servlet dispatcherServlet was not registered (possibly already registered?)
2015-06-09 18:24:17.763  INFO 5344 --- [           main] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-06-09 18:24:17.779  INFO 5344 --- [           main] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2015-06-09 18:24:17.779  INFO 5344 --- [           main] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'openEntityManagerInViewFilter' to: [/*]
2015-06-09 18:24:17.779  INFO 5344 --- [           main] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'springSecurityFilterChain' to: [/*]

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    我相信您需要通过创建一个与 dispatcherServlet 同名的 bean 来覆盖默认的 dispatcherServlet。从leveluplunch website 的教程中,我发现了以下内容:

    @Bean
    public DispatcherServlet dispatcherServlet() {
        return new DispatcherServlet();
    }
    
    /**
     * Register dispatcherServlet programmatically 
     * 
     * @return ServletRegistrationBean
     */
    @Bean
    public ServletRegistrationBean dispatcherServletRegistration() {
    
        ServletRegistrationBean registration = new ServletRegistrationBean(
            dispatcherServlet(), "/levelup/*");
        registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
    
        return registration;
    }
    

    【讨论】:

      【解决方案2】:

      我发现我可以通过属性文件向 DispatcherServlet 提供详细信息:

      server.servlet-path=/local/*

      如果想禁用DispatcherServlet,有什么办法吗?

      【讨论】:

        猜你喜欢
        • 2017-11-30
        • 1970-01-01
        • 2016-06-30
        • 2014-03-05
        • 2019-01-11
        • 2017-06-12
        • 2017-06-09
        • 2017-12-12
        • 2018-03-14
        相关资源
        最近更新 更多