我的Spring-MVC(4.1.5.RELEASE)网络应用程序中有一个名为headers.jsp的简单页面,我想从我的索引页面调用,如下所示:
<body>
<c:url value="/headers" var="headersUrl1"/>
<c:url value="/headers.jsp" var="headersUrl2"/>
<c:url value="/headers.jspx" var="headersUrl3"/>
<ul>
<li><a href="${headersUrl1}">Works!</a></li>
<li><a href="${headersUrl2}">Does not work!</a></li>
<li><a href="${headersUrl3}">Does not work!</a></li>
</ul>
第一个url(to / headers)工作正常,但另外两个(带后缀.jsp / jspx)没有;结果是404.我需要链接工作(在现实生活中,它们来自我必须使用的遗留数据库)。我花了很长时间谷歌搜索,但尚未找到解决方案。 链接请求由以下控制器代码处理:
@Controller
public class HeadersViewController {
@RequestMapping(value = {"/headers"}, method = RequestMethod.GET)
public String getHeadersPage() {
return "headers";
}
@RequestMapping(value = {"/headers**"}, method = RequestMethod.GET)
public String getHeaderPages() {
return "headers";
}
@RequestMapping(value = {"/headers.jspx"}, method = RequestMethod.GET)
public String getHeaderPageJspx() {
return "headers";
}
@RequestMapping("/{name}.jspx")
public String getPageByName(@PathVariable("name") String name) {
return name;
}
}
请求/headers.jsp或/headers.jspx时,不会调用任何控制器方法。
奇怪的是,当使用spring-test和mock-mvc时,他们会被解雇并进行测试以检查所提到的url的通行证。 任何帮助非常感谢!其余的配置代码如下所示。
Dispatcherservlet init:
public class DispatcherServletInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { SecurityConfiguration.class, WebMvcConfiguration.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new HiddenHttpMethodFilter() };
}
}
MvcConfiguration:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"nl.demo.web.controller"})
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index").setViewName("index");
registry.addViewController("/login");
registry.addViewController("/logout");
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/");
viewResolver.setSuffix(".jsp");
viewResolver.setOrder(0);
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
安全配置:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/images/**", "/js/**", "/css/**", "/fonts/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/index")
.failureUrl("/login?error=1")
.permitAll()
.and()
.httpBasic()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login?logout=1")
.permitAll();
}
@Autowired
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
String user = "test";
String password = "blabla";
String[] roleList = "USER,SUPERVISOR".split(",");
auth.inMemoryAuthentication()
.withUser(user)
.password(password)
.roles(roleList);
}
}
答案 0 :(得分:1)
问题的最可能原因是*.jsp
和*.jspx
扩展名通常由容器处理。例如,如果您检查tomcat的conf/web.xml
,您会注意到配置
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
其他容器也是如此。这就是为什么你的测试工作正常,但真正的应用程序请求失败。
您最好的选择是实现一个过滤器,它将映射到相同的模式,并将重定向headers.jsp
和headers.jspx
,由控制器处理,同时保留另一个要求容器按照通常的方式处理,您在此question
答案 1 :(得分:0)
问题是您的servlet映射到res.[DESeq2/edgeR/limma]
而不是/
。 /*
是一个特殊的映射,意味着Spring MVC DispatcherServlet接收所有未被其他任何东西管理的请求。
由于JSP和JSF是自动注册的servlet,servlet容器会尝试将请求传递给JSP(resp。JSF)文件,如果找不到,则会立即发送404并且不会尝试将其传递给DispatcherServlet
您应该将调度程序servlet映射到/
。但请注意,在这种情况下,所有URL都将提供给调度程序servlet,您将不得不对提供静态资源进行特殊处理:您必须为您的Spring MVC配置文件添加/*
的覆盖(从Spring Framework参考手册 - 静态资源的服务):
addResourceHandlers