2016-07-25 11 views
6

Mam starszą aplikację przy użyciu źródłowego xml, który migruję do wiosennego rozruchu.rozruch wiosenny przy użyciu wielu rozpoznawania widoku z konfiguracji xml niepoprawnie przekierowujący

Aplikacja zostanie uruchomiona i otrzymam stronę uwierzytelnienia, zamapowaną w aplikacji applicationContext-login.xml. Po pomyślnym zalogowaniu powinien załadować WEB-INF/client/home.jsp, ale zamiast tego próbuje załadować /WEB-INF/auth/home.jsp i otrzymuję 404. W logu uruchamiania widzę to mapowanie wszystkich ścieżki. Dlaczego jest to sprzeczne w przypadku tych przekierowań i co mogę zrobić, aby to naprawić? Czy występują problemy z powodu wielu @ImportResource zawierających funkcje rozpoznawania widoku?

Wyciąg z konfiguracji http bezpieczeństwo:

<s:http use-expressions="true" entry-point-ref="delegatingAuthenticationEntryPoint"> 
     <s:form-login login-page="/auth/login" 
         login-processing-url="/auth/j_spring_security_check" 
         authentication-failure-url="/auth/login-secure?loginFailed=true" 
         default-target-url="/auth/defaultEntry"/> 
     <s:logout logout-url="/auth/logout" logout-success-url="/auth/logout-success" delete-cookies="jsessionid"/> 
    </s:http> 

Regulator wskazuje na:

@RequestMapping(value = "/defaultEntry", method = RequestMethod.GET) 
    public String defaultEntry() { 
     if (authentication.isAuthenticated()) { 
       return "redirect:/client/home"; 
     } else { 
      return "redirect:login"; 
     } 
    } 

aplikacja ma wiele widok przeliczniki skonfigurowany w plikach XML:

  • ścieżki klasy *:/springContext/applicationContext-login.xml

    <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:mvc="http://www.springframework.org/schema/mvc" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
             http://www.springframework.org/schema/beans/spring-beans.xsd 
             http://www.springframework.org/schema/context 
             http://www.springframework.org/schema/context/spring-context.xsd 
             http://www.springframework.org/schema/mvc 
             http://www.springframework.org/schema/mvc/spring-mvc.xsd" 
        default-init-method="init" 
        default-destroy-method="destroy"> 
    
        <import resource="applicationContext-web-common.xml" /> 
    
        <!-- Static login resources --> 
        <mvc:resources mapping="/css/**" location="/WEB-INF/auth/css/"/> 
        <mvc:resources mapping="/assets/**" location="/WEB-INF/auth/assets/"/> 
        <mvc:resources mapping="/js/**" location="/WEB-INF/auth/js/"/> 
    
        <context:component-scan base-package="org.myCompany.auth" /> 
    
        <!-- view resolver for JSP --> 
        <bean id="loginViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
         <property name="prefix" value="/WEB-INF/auth/"/> 
         <property name="suffix" value=".jsp"/> 
        </bean> 
    
        <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 
         <property name="defaultLocale" value="en_US"/> 
        </bean> 
    

  • classpath *:/springContext/ApplicationContext-client.xml”

    <?xml version="1.0" encoding="UTF-8"?> 
    
    <beans xmlns="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:context="http://www.springframework.org/schema/context" 
         xmlns:mvc="http://www.springframework.org/schema/mvc" 
         xsi:schemaLocation="http://www.springframework.org/schema/beans 
             http://www.springframework.org/schema/beans/spring-beans.xsd 
             http://www.springframework.org/schema/context 
             http://www.springframework.org/schema/context/spring-context.xsd 
             http://www.springframework.org/schema/mvc 
             http://www.springframework.org/schema/mvc/spring-mvc.xsd" 
         default-init-method="init" 
         default-destroy-method="destroy"> 
    
        <import resource="applicationContext-web-common.xml" /> 
    
        <context:component-scan base-package="org.myCompany.client" /> 
    
        <!-- Static resources --> 
        <mvc:resources mapping="/player/**" location="/WEB-INF/client/player/"/> 
        <mvc:resources mapping="/css/**" location="/WEB-INF/client/css/"/> 
        <mvc:resources mapping="/data/**" location="/WEB-INF/client/data/"/> 
        <mvc:resources mapping="/js/**" location="/WEB-INF/client/js/"/> 
        <mvc:resources mapping="/locales/**" location="/WEB-INF/client/locales/"/> 
        <mvc:resources mapping="/media/**" location="/WEB-INF/client/media/"/> 
        <mvc:resources mapping="/index.html" location="/WEB-INF/client/index.html"/> 
        <mvc:resources mapping="/test.html" location="/WEB-INF/client/test.html"/> 
        <mvc:resources mapping="/admin/**" location="/WEB-INF/client/admin/"/> 
        <mvc:resources mapping="/documentation/**" location="/WEB-INF/client/documentation/"/> 
    
    
        <bean id="clientViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
         <property name="prefix" value="/WEB-INF/client/"/> 
         <property name="suffix" value=".jsp"/> 
        </bean> 
    
    
    </beans> 
    

Istnieje również kilka innych, według tego samego wzorca konfiguracyjnego.

wczytuję zasobów w Application.java

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) 
    //@EnableWebMvc 
    @ComponentScan({"org.myCompany"}) 
    @ImportResource({"classpath*:/springContext/applicationContext-controllers.xml", 
      "classpath*:/springContext/applicationContext-rest.xml", 
      "classpath*:/springContext/applicationContext-login.xml", 
      "classpath*:/springContext/applicationContext-client.xml", 
      "classpath*:/springContext/applicationContext-admin.xml", 
      "classpath*:/springContext/applicationContext-logging.xml", 
      "classpath*:/springContext/applicationContext-web-common.xml" 
    }) 
    public class Application extends SpringBootServletInitializer { 

     public static void main(String[] args) throws UnknownHostException { 
      SpringApplication app = new SpringApplication(Application.class); 
      ApplicationContext ctx = app.run(args); 
      Environment env = ctx.getEnvironment(); 

      logger.info(String.format("\n----------------------------------------------------------\n\t" + 
          "Application '%s' is running! Access URLs:\n\t" + 
          "Local: \t\thttp://localhost:%s\n\t" + 
          "External: \thttp://%s:%s\n----------------------------------------------------------", 
        env.getProperty("spring.application.name"), 
        env.getProperty("server.port"), 
        InetAddress.getLocalHost().getHostAddress(), 
        env.getProperty("server.port"))); 
     } 

     @Bean 
     public ServletRegistrationBean restDispatcher() { 
      ServletRegistrationBean registration = new ServletRegistrationBean(new DispatcherServlet(), 
        "/rest/*", "/websocket/*"); 
      registration.setName("rest-dispatcher"); 
      registration.setLoadOnStartup(2); 
      Map<String, String> params = new HashMap<>(); 
      params.put("contextConfigLocation", "classpath*:springContext/applicationContext-rest.xml"); 
      registration.setInitParameters(params); 
      return registration; 
     } 

     @Bean 
     public ServletRegistrationBean authDispatcher() { 
      ServletRegistrationBean registration = new ServletRegistrationBean(new DispatcherServlet(), "/auth/*"); 
      registration.setName("auth-dispatcher"); 
      registration.setLoadOnStartup(2); 
      Map<String, String> params = new HashMap<>(); 
      params.put("contextConfigLocation", "classpath*:springContext/applicationContext-login.xml"); 
      registration.setInitParameters(params); 
      return registration; 
     } 

     @Bean 
     public ServletRegistrationBean clientDispatcher() { 
      ServletRegistrationBean registration = new ServletRegistrationBean(new DispatcherServlet(), "/client/*"); 
      registration.setName("client-dispatcher"); 
      registration.setLoadOnStartup(2); 
      Map<String, String> params = new HashMap<>(); 
      params.put("contextConfigLocation", "classpath*:springContext/applicationContext-client.xml"); 
      registration.setInitParameters(params); 
      return registration; 
     } 

    //... other servlets registration, filters registration 

    } 

Odpowiedz

2

Wracasz redirect:/client/home z ekranu logowania, który dostanie przetwarzane przez loginViewResolver:

<bean id="loginViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/WEB-INF/auth/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

clientViewResolver nie get invoked, ponieważ nie ma żadnego określonego porządku na widokach rozpoznawania nazw. Możesz ustawić zamówienie za pomocą właściwości zamówienia.,

+0

Ale jak to wszystko działa dobrze na aplikacji Spring MVC? –

+0

Jeśli nie określisz zamówienia, jego domyślna kolejność na obu - co oznacza, że ​​jest pierwsza, nie jest przewidywalna, a więc może działać lub nie. – 6ton

+0

Dodano zamówienie 1 do klienta i 2 do zalogowania. Teraz właśnie otrzymuję URL żądania: http: // localhost: 8000/client/home Metoda żądania: GET Kod stanu: 404 nie znaleziono –

1

Mogę założyć, że jest to spowodowane konfiguracją Spring Security i nie zależy od View Resolvers. Wygląda na to, że po sukcesie użytkownik logowania jest przekierowywany na stronę, do której wcześniej próbował uzyskać dostęp, i może nie być /defaultEntry. Spróbuj edytować konfigurację http Spring Security w następujący sposób:

<s:http use-expressions="true" entry-point-aref="delegatingAuthenticationEntryPoint"> 
    <s:form-login login-page="/auth/login" 
        login-processing-url="/auth/j_spring_security_check" 
        authentication-failure-url="/auth/login-secure?loginFailed=true" 
        default-target-url="/auth/defaultEntry" 
        always-use-default-target="true"/> 
    <s:logout logout-url="/auth/logout" logout-success-url="/auth/logout-success" delete-cookies="jsessionid"/> 
</s:http> 

Jeśli to pomoże - dostaniesz wskazówkę, gdzie szukać dalej.

Sprawdź również to StackOverFlow answer.

1

Problem z konfiguracją serwletu dyspozytora zdefiniowano

<bean id="clientViewResolve" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
    <property name="prefix" value="/WEB-INF/client/"/> 
    <property name="suffix" value=".jsp"/> 

Przy tej konfiguracji, jego prawdopodobne, aby postanowili /WEB-INF/client/client/*.jsp

Lepiej używać pojedynczego parametru viewTolver niż kompilować zadanie posiadania dwóch rzutników widoku.