使用xml配置中的多个视图解析器进行spring-boot而不是正确重定向

时间:2016-07-25 14:53:32

标签: xml spring jsp spring-mvc spring-boot

我有一个使用spring xml的遗留应用程序,我正在迁移到spring-boot。

应用程序启动,我获得了身份验证页面,映射在 applicationContext-login.xml 中。登录成功后,它应该加载WEB-INF / client / home.jsp,但是,它尝试加载/WEB-INF/auth/home.jsp,我得到404。 在启动日志中,我看到它映射了所有路径。 为什么在这些重定向上存在冲突,我该怎么做才能解决这个问题?由于多个包含视图解析器的@ImportResource会遇到问题吗?

从安全性http配置中提取:

    <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>

它指向的控制器:

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

该应用程序在xml文件中配置了多个视图解析器:

  • 类路径*:/ 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>
    

  • 类路径*:/ 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>
    

还有一些其他人遵循相同的配置模式。

我正在加载 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

    }

3 个答案:

答案 0 :(得分:2)

您将从登录屏幕返回redirect:/client/home,这将由您的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。您可以使用订单属性设置订单。

答案 1 :(得分:1)

我可以假设,这是由Spring Security配置引起的,并且不依赖于View Resolvers。看起来成功后登录用户被重定向到他之前尝试访问的页面,它可能不是m looking for a solution but I don。尝试按如下方式编辑Spring Security http配置:

/defaultEntry

如果有帮助 - 您将获得进一步了解的线索。

另外,请查看此StackOverFlow answer

答案 2 :(得分:1)

您定义的调度程序servlet配置问题

  <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"/>

使用该配置,它可能会被解析为/ WEB-INF / client / client / * .jsp

最好使用单个视图解析器,而不是复杂化具有两个视图解析器的任务。