我有控制器处理/
的请求并返回相应的jsp
。在切换到基于注释的配置并添加Spring安全性后,我在登录成功时得到HTTP 404
。在我看来,所有配置都已到位。怎么了?
的AppConfig
@EnableWebMvc
@Configuration
@ComponentScan({"app.controller.*"})
@Import({SecurityConfig.class})
@PreAuthorize("hasRole('ROLE_ADMIN')")
public class AppConfig {
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/pages");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/");
}
SecurityConfig
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{
auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception{
http.authorizeRequests()
.antMatchers("/**").access("hasRole('ROLE_ADMIN')")
.and().formLogin();
}
}
SpringMvcInitializer
public class SpringMvcInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{AppConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
控制器
@Controller
@RequestMapping("/")
public class AppController {
@RequestMapping(value = "/", method= RequestMethod.GET)
public String getRequestPage(Model model){ .....}
}
更新
将SpringMvcInitializer更改为以下代码没有帮助:
@Override
protected String[] getServletMappings() {
return new String[]{"/*"};
}
UPDATE2:
由于某些原因IntelliJ显示它无法在 SecurityConfig 类
中自动装配beanAuthenticationManager
UPDATE3
我删除了Facets中的任何部署描述符(它仍然建议创建web.xml但我认为我不需要它,因为我只通过代码配置Spring)。正确?
答案 0 :(得分:0)
我可以在你的SpringMvcInitializer
中看到你将调度程序servlet映射到/
。 AFAIK,您无法使用此映射将控制器映射到/
。免责声明:我真的不知道为什么但我在其他post中提供了更多详细信息。
恕我直言,如果没有副作用,你应该将servlet映射到/*
,因为我不知道用web.xml声明welcome-file-list
的任何方法。但是你总是可以尝试只让web.xml文件中的<welcome-file-list>
,所有剩余的配置都迁移到注释和java配置。 3.0+ servlet容器应该正确处理它们。
编辑:
在配置中进一步查看,我发现了不寻常的配置:
PreAuthorize
注释 - 您应该尝试将其删除