Java 成功登录后,Spring servlet映射不起作用

Java 成功登录后,Spring servlet映射不起作用,java,spring,spring-mvc,servlets,spring-security,Java,Spring,Spring Mvc,Servlets,Spring Security,我有一个控制器,它处理对/的请求,并返回相应的jsp。在切换到基于注释的配置并添加Spring安全性之后,当登录成功时,我得到了HTTP404。在我看来,所有配置都已就绪。怎么了 AppConfig @EnableWebMvc @Configuration @ComponentScan({"app.controller.*"}) @Import({SecurityConfig.class}) @PreAuthorize("hasRole('ROLE_ADMIN')") public class

我有一个控制器,它处理对
/
的请求,并返回相应的
jsp
。在切换到基于注释的配置并添加Spring安全性之后,当登录成功时,我得到了
HTTP404
。在我看来,所有配置都已就绪。怎么了

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/");
    }
@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();
    }
}
SecurityConfig

@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/");
    }
@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();
    }
}
springmvcinInitializer

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){ .....}
}
更新

将SpringMVCiInitializer中的代码更改为以下代码没有帮助:

@Override
        protected String[] getServletMappings() {
            return new String[]{"/*"};
        }
更新2:

出于某种原因,IntelliJ显示它无法在SecurityConfig类中自动连接bean
AuthenticationManager

更新3


我删除了Facets中的所有部署描述符(它仍然建议创建web.xml,但我认为我不需要它,因为我只通过代码配置Spring)。是吗?

我可以在
springmvcinInitializer
中看到您将dispatcher servlet映射设置为
/
。抱歉,您无法使用此映射将控制器映射到
/
。免责声明:我真的不知道为什么,但我在另一篇文章中给出了更多的细节

依我看,如果没有副作用,您应该将servlet映射到
/*
,因为除了web.xml之外,我不知道如何声明
欢迎文件列表。但是您总是可以尝试只让web.xml文件中的
,所有剩余的配置都迁移到注释和java配置中。3.0+servlet容器应该正确处理这两种情况

编辑:

进一步查看您的配置,我发现了一些不寻常的配置:

  • AppConfig似乎配置servlet部分(扫描控制器包并声明资源处理),但它被声明为根应用程序上下文。IMHO最好将其声明为DispatcherServlet应用程序上下文
  • 我从未在配置文件中看到过
    预授权的
    注释-您应该尝试删除它

setPrefix(“/WEB-INF/pages”)
。。。这难道不是问题吗?通常前缀以斜杠结尾,因此如果您没有从控制器返回带有前导斜杠的视图名称,则可能导致404,因为视图将解析为例如
/WEB-INF/pageshome.jsp
。但在不知道您从控制器返回什么的情况下,这只是一个猜测:)我返回的jsp页面名称没有前导斜杠和jsp后缀。那么这可能就是我在评论中提到的问题。尝试将前缀设置为
/WEB-INF/pages/
(注意后面的斜杠)。我没有成功。此外,我无法访问任何资源,例如
/resources/css/bootstrap.css
返回
404
能否显示基于xml的配置?可以更容易地确定was不在当前的java配置中。您能说404是由控制器未命中或未找到视图引起的吗?(将spring日志放在调试级别有助于发现这一点)我将
log4j.logger.org.springframework=debug
放在
log4j.properties
中,但记录器不工作,尽管我已经将所有依赖项都包含在
pom.xml
中。如何让它工作?@RCola我担心登录spring MVC应用程序是另一个问题。。。无论如何,我真的猜不到会发生什么(太多的可能性:-()
log4j:DocumentBuilderFactory是:com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl log4j:debug attribute=“null”。log4j:忽略调试属性。log4j:reset attribute=“false”。log4j:Threshold=“null”。log4j:根的级别值是[debug].log4j:根级别设置为调试log4j:类名:[com.pyx4j.log4j.MavenLogAppender]log4j:解析类布局:“org.apache.log4j.patternallayout”log4j:将属性[conversionPattern]设置为[%m]。log4j:将名为[MavenLogAppender]的附件添加到类别[root]。