【发布时间】:2016-11-28 23:45:17
【问题描述】:
我有一个使用 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
}
【问题讨论】:
标签: xml spring jsp spring-mvc spring-boot