Spring Boot无法解析静态内容

时间:2017-07-17 16:26:21

标签: java spring spring-mvc spring-security

因此,在添加Spring Security后(不确定是否是原因),不仅默认的静态内容解析路径无效,而且还会出现将URL映射到静态内容的任何后续尝试

例如,没有WebSecurityConfigurerAdapter的vanilla Spring Boot应用程序会将/GET localhost:8080/index.html映射到ResourceHttpRequestHandler,并使用默认配置的静态内容位置,例如classpath:META-INF/resourcesclasspath:static/

因此,位于其中一个类路径位置的index.html会自动提供。

然而,使用WebSecurityConfigurerAdapter,我得到405s ......无论我做什么......看起来处理程序注册表将不包含到上述ResourceHttpRequestHandler位置的映射

例如

尝试显式添加映射

使用ResourceHandlerRegistry

@Configuration
public class ServletConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/index.html").addResourceLocations("classpath:statc/index.html");
        super.addResourceHandlers(registry);
    }
}

以下是TRACE日志

2017-07-17 12:12:21.742 DEBUG 23566 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/]
2017-07-17 12:12:21.755 DEBUG 23566 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /
2017-07-17 12:12:21.760 DEBUG 23566 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
2017-07-17 12:12:21.768 DEBUG 23566 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Invoking @ExceptionHandler method: public final org.springframework.http.ResponseEntity<java.lang.Object> org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler.handleException(java.lang.Exception,org.springframework.web.context.request.WebRequest)

在处理Spring Security时,这是一个已知且经常遇到的问题吗?

或者这可能与Spring Security没有预期和无关?我之前已经完成了很多次设置,唯一新的是Spring Security

以下是SecurityConfiguration

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


    @Autowired
    private UserDetailService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        final DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
        daoAuthenticationProvider.setPasswordEncoder(new StandardPasswordEncoder());
        daoAuthenticationProvider.setUserDetailsService(userDetailsService);
        /*
        it is important to set the default userDetailsService on AuthenticationManagerBuilder
         */
        auth.authenticationProvider(daoAuthenticationProvider).userDetailsService(userDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        org.springframework.security.web.authentication.AuthenticationSuccessHandler authenticationSuccessHandler = new AuthenticationSuccessHandler();
        http
                .csrf()
                .disable()
                .exceptionHandling()
                .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
                .and()
                .authorizeRequests()
                .antMatchers("/index.html").permitAll()
                .antMatchers("/api/security/**")
                .hasAuthority("ADMIN")
                .antMatchers("/api/portfolios/**", "/api/trades/**", "/api/user/**", "/api/init")
                .authenticated()
                .and()
                .formLogin()
                .successHandler(authenticationSuccessHandler)
                .failureHandler(new SimpleUrlAuthenticationFailureHandler())
                .and()
                .rememberMe()
                .and()
                .logout()
                .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK));
    }
}

请注意,启动日志显示默认的静态内容处理程序映射和我的显式映射都存在并配置......当实际请求发出时它们就不存在:

2017-07-17 12:25:57.088 DEBUG 23702 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/**/favicon.ico", locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], class path resource []], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@23707d5d]
2017-07-17 12:25:57.089 DEBUG 23702 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/index.html", locations=[class path resource [statc/index.html]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@5fa49615]
2017-07-17 12:25:57.089 DEBUG 23702 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/webjars/**", locations=[class path resource [META-INF/resources/webjars/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@7921eb37]
2017-07-17 12:25:57.089 DEBUG 23702 --- [           main] o.s.w.s.resource.ResourceUrlProvider     : Found resource handler mapping: URL pattern="/**", locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@3fdb9c55]

修改 深入挖掘

RequestMappingInfoHandlerMapping.java:195 URL:[], method: PUT上的 PartialMatchHelper 似乎与每个请求都匹配!

1 个答案:

答案 0 :(得分:0)

我的一些小错误 - 但有很大的影响(在了解了Spring MVC框架如何在内部工作之后)

我不小心添加了这样的控制器

@RestController("registration")
public class RegistrationController { ... }

当我的意思

@RestController
@RequestMapping("registration")
public class RegistrationController {...}

所以我的注册REST端点不起作用......明确但是......以前的配置也通过放置一个空的 URL:[],METHOD:PUT / POST或其他任何<来影响静态内容解析/ strong> into RequestMappingHandlerMapping ,这是可以优先于静态资源映射的处理程序映射之一

故事的寓意是:

debug DispatcherServlet.java以查看真正使用的处理程序映射