我已经配置了一个简单的安全单页Web应用程序,如下所示:
@Configuration
@EnableAutoConfiguration
@EnableWebMvcSecurity
public class MvcConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
//.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
在.loginPage("/login")
注释掉后,我会看到如下所示的默认登录页面:
一切都按预期工作。
但是,如果我取消注释.loginPage("/login")
以使其指向我的自定义login.html
页面,则会出现404错误。
这是我目前的文件结构:
main
L resources
L static
- index.html
- login.html
我知道我可以使用XML
设置viewResolver并在阳光下配置每个小东西,但我也理解Spring Boot有一些我可以利用的默认设置,如果我想让事情变得简洁尽可能。
我的问题是:Spring在哪里查找login.html
文件?为了避免出现404错误,必须放置login.html
文件的绝对URL是什么?
此外,如果解决方案必须涉及到配置spring,我宁愿避免使用XML并尽可能选择基于Java的配置。
答案 0 :(得分:0)
<强>更新强>
事实证明,通过将这两行添加到application.properties
,您可以在弹簧启动时获得相同的结果:
spring.thymeleaf.prefix = /WEB-INF/templates/
spring.thymeleaf.suffix = .html
原始回答
如果其他人有类似的问题,这对我有用:
除了问题上显示的MvcConfig
之外,我还要创建另一个类:
@EnableAutoConfiguration
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean public ViewResolver viewResolver() {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setTemplateMode("LEGACYHTML5");
templateResolver.setPrefix("templates/");
templateResolver.setSuffix(".html");
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver);
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(engine);
return viewResolver;
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/login").setViewName("login");
}
}
正如您所看到的,此类有一个带有viewResolver的Bean,它将呈现您可能拥有的任何Thymeleaf模板。它还为登录页面和索引页面添加了视图控制器。两者都位于templates
文件夹而不是static
。
如果您尝试重现this example
,这应该有用