title: 404 error using Spring MVC Security Java Config on JBoss
body: <p>I wrote a small Spring MVC application with Java Config and secured it with Spring Security 3.2.5. It is working perfectly fine on Tomcat but not on JBoss EAP 6.2. It gets successfully deployed on JBoss but I get this warning when I request any page defined by Spring MVC and 404 error in browser.</p>
  
  <p><code>WARN  [org.springframework.web.servlet.PageNotFound] (http-/127.0.0.1:8080-1) No mapping found for HTTP request with URI [/example-web/pages/login.jsp] in DispatcherServlet with name 'dispatcher'</code>  </p>
  
  <p>Since Spring Security is used, for any request that needs authenticated user e.g. <code>http://localhost:8080/example-web/start</code>, Spring Security redirects to <code>https://localhost:8443/example-web/login</code>   That is when I see the warning and 404 error.</p>
  
  <p>Here you can see my code:</p>
  
  <pre><code>public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  
  @Override
  protected Class&lt;?&gt;[] getRootConfigClasses() {
      return new Class[] { RootConfiguration.class};
  }
  
  @Override
  protected Class&lt;?&gt;[] getServletConfigClasses() {
      return new Class[] { WebMvcConfig.class };
  }
  
  @Override
  protected String[] getServletMappings() {
      return new String[] { "/*" };
  }
  
  @Override
  protected Filter[] getServletFilters() {
      return new Filter[] { new HiddenHttpMethodFilter() };
  }
  }
  </code></pre>
  
  <p>Here is my Spring MVC configuration:</p>
  
  <pre><code>@EnableWebMvc
  @ComponentScan("com.spring.example.w.controller")
  @Configuration
  public class WebMvcConfig extends WebMvcConfigurerAdapter {
  
      @Override
      public void addViewControllers(ViewControllerRegistry registry) {
          registry.addViewController("login").setViewName("login");
          registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
      }
  
      @Bean
      public InternalResourceViewResolver getInternalResourceViewResolver(){
          InternalResourceViewResolver resolver = new InternalResourceViewResolver();
          resolver.setPrefix("/pages/");
          resolver.setSuffix(".jsp");
          return resolver;
      }
  }
  </code></pre>
  
  <p>Below is my Spring Security configuration:</p>
  
  <pre><code>@Configuration
  @EnableWebSecurity
  public class SecurityConfig extends WebSecurityConfigurerAdapter {
  
      @Override
      protected void configure(HttpSecurity http) throws Exception{
  
          http
              .addFilter(myUsernamePasswordAuthenticationFilter())
              .authorizeRequests()
                  .antMatchers("/login").permitAll()
                  .antMatchers("/admin/**").hasRole("Admin")
                  .antMatchers("/start/**").hasRole("Viewer")
                  .antMatchers("/user/**").hasRole("User")
                  .antMatchers("/**").hasRole("User")
                  .and()
              .httpBasic().authenticationEntryPoint(loginUrlAuthenticationEntryPoint())
                  .and()
              .logout()
                  .permitAll()
                  .and()
              .requiresChannel()
                   .anyRequest().requiresSecure();
      }
  
      @Bean
      public LoginUrlAuthenticationEntryPoint loginUrlAuthenticationEntryPoint(){
          LoginUrlAuthenticationEntryPoint loginUrlAuthenticationEntryPoint = new LoginUrlAuthenticationEntryPoint("/login");
          return loginUrlAuthenticationEntryPoint;
      }
  
  
      @Bean
      public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider(){
          ActiveDirectoryLdapAuthenticationProvider authProvider = new ActiveDirectoryLdapAuthenticationProvider(my_domain, my_url);
          authProvider.setConvertSubErrorCodesToExceptions(true);
          authProvider.setUseAuthenticationRequestCredentials(true);
          authProvider.setUseAuthenticationRequestCredentials(true);
          authProvider.setUserDetailsContextMapper(userDetailsContextMapper());
          return authProvider;
      }
  
      @Bean
      public UserDetailsContextMapper userDetailsContextMapper(){
          CustomUserDetailsContextMapper myAuthoritiesPopulator = new CustomUserDetailsContextMapper();
          return myAuthoritiesPopulator;
      }
  
      @Bean
      public CustomUsernamePasswordAuthenticationFilter myUsernamePasswordAuthenticationFilter()
              throws Exception {
          CustomUsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter = new CustomUsernamePasswordAuthenticationFilter();
          usernamePasswordAuthenticationFilter.setAuthenticationManager(authenticationManager());
          usernamePasswordAuthenticationFilter.setAllowSessionCreation(true);
          SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
          usernamePasswordAuthenticationFilter.setAuthenticationSuccessHandler(successHandler);
          usernamePasswordAuthenticationFilter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler("/login?error"));
          usernamePasswordAuthenticationFilter.afterPropertiesSet();
          return usernamePasswordAuthenticationFilter;
      }
  
      @Autowired
      public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{
          auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider());
      }
  }
  </code></pre>
  
  <p>Then SecurityWebApplicationInitializer:</p>
  
  <pre><code>public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
  }
  </code></pre>
  
  <p>And RootConfig:</p>
  
  <pre><code>@Configuration
  @ComponentScan
  public class RootConfiguration {
  }
  </code></pre>
  
  <p>And below is how I configured JBoss for SSL:</p>
  
  <pre><code>&lt;subsystem xmlns="urn:jboss:domain:web:1.5" default-virtual-server="default-host" native="false"&gt;
      &lt;connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" redirect-port="8443"/&gt;
      &lt;connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true"&gt;
          &lt;ssl name="ssl" password="&lt;my_password&gt;" certificate-key-file="c:\mykeystore.jks" protocol="TLSv1" verify-client="false"/&gt;
      &lt;/connector&gt;
      &lt;virtual-server name="default-host" enable-welcome-root="true"&gt;
          &lt;alias name="localhost"/&gt;
          &lt;alias name="example.com"/&gt;
      &lt;/virtual-server&gt;
  &lt;/subsystem&gt;
  </code></pre>
  
  <p>During deployment, I can see in the log that the requests do get mapped:</p>
  
  <pre><code>INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 71) Mapped "{[/start],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.spring.example.w.controller.StartController.handleStart() throws javax.servlet.ServletException,java.io.IOException
  INFO  [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (ServerService Thread Pool -- 71) Mapped URL path [/login] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
  INFO  [org.springframework.web.context.ContextLoader] (ServerService Thread Pool -- 71) Root WebApplicationContext: initialization completed in 2530 ms
  INFO  [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/example-web]] (ServerService Thread Pool -- 71) Initializing Spring FrameworkServlet 'dispatcher'
  INFO  [org.springframework.web.servlet.DispatcherServlet] (ServerService Thread Pool -- 71) FrameworkServlet 'dispatcher': initialization started
  </code></pre>
  
  <p>Any help about why I get 404 error and this warning is highly appreciated. Once again I should emphasize that it is working on Tomcat. Thanks in advance.</p>