gpt4 book ai didi

java - 带有 .jsp/.jsp 后缀的 Spring MVC 链接返回 404

转载 作者:行者123 更新时间:2023-11-30 11:02:34 25 4
gpt4 key购买 nike

我的 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(指向/headers)可以正常工作,但其他两个(后缀为 .jsp/jspx)不能;结果是 404。我需要链接才能工作(在现实生活中,它们来 self 必须使用的遗留数据库)。我花了很多时间在谷歌上搜索,但还没有找到解决方案。对链接的请求由以下 Controller 代码处理:

@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 时,不会调用任何 Controller 方法。

奇怪的是,当使用 spring-test 和 mock-mvc 时,它们确实会被触发并进行测试以检查提到的 url 是否通过。非常感谢任何帮助!下面给出了其余的配置代码。

Dispatcherservlet 初始化:

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() };
}

}

Mvc配置:

@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);
}
}

最佳答案

您的问题最可能的原因是 *.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.jspheaders.jspx 到由 Controller 处理,同时让其他请求由容器正常处理,你有一个例子 question

关于java - 带有 .jsp/.jsp 后缀的 Spring MVC 链接返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709023/

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