我有一个使用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
}
答案 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
最好使用单个视图解析器,而不是复杂化具有两个视图解析器的任务。