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

Ale*_*sel 6 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>
Run Code Online (Sandbox Code Playgroud)

它指向的控制器:

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

该应用程序在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>
    
    Run Code Online (Sandbox Code Playgroud)

  • 类路径*:/ 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>
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    }
Run Code Online (Sandbox Code Playgroud)

6to*_*ton 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>
Run Code Online (Sandbox Code Playgroud)

clientViewResolver 不会被调用,因为视图解析器上没有指定顺序。您可以使用 order 属性设置顺序。,