gpt4 book ai didi

xml - spring-boot 使用来自 xml 配置的多个 View 解析器无法正确重定向

转载 作者:数据小太阳 更新时间:2023-10-29 01:51:34 27 4
gpt4 key购买 nike

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

应用程序启动,我得到身份验证页面,映射在 applicationContext-login.xml 中。登录成功后,它应该加载 WEB-INF/client/home.jsp,但相反,它尝试加载/WEB-INF/auth/home.jsp,我得到 404。在启动日志中,我看到它映射了所有路径。 为什么这些重定向会发生冲突?我该怎么做才能解决这个问题?它是否因为多个包含 View 解析器的@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>

它指向的 Controller :

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

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

  • classpath*:/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>

还有其他几个遵循相同的配置模式。

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

}

最佳答案

您正在从登录屏幕返回 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 不会被调用,因为在 View 解析器上没有指定顺序。您可以使用 order 属性设置顺序。,

关于xml - spring-boot 使用来自 xml 配置的多个 View 解析器无法正确重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38571041/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com