Spring MVC (3.0) 将带有和不带有斜杠的 URL 视为相同的 URL。
例如:
http://www.example.org/data/something = http://www.example.org/data/something/
我需要用尾部斜杠重定向 URL
到没有它的 URL:
我需要在应用程序内部执行此操作(因此不要通过 Apache 等重写规则)。
一种方法是:
@ResponseStatus(value=HttpStatus.MOVED_PERMANENTLY)
@RequestMapping(value = "/data/something/")
public String dataSomethingRedirect(...) {
return "redirect:/data/something";
}
但这通常有两个问题:
- Controller 过多
- 参数问题:比如错误的编码
问题
有没有办法拦截所有的 URL,如果它们有斜杠,将它们重定向到不带斜杠的相对 URL?
最佳答案
你可以在你的 web 配置中列出你需要的所有重写规则
如果数量不多,您可以像这样配置重定向 View
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/my/path/", "/my/path")
.setKeepQueryParams(true)
.setStatusCode(HttpStatus.PERMANENT_REDIRECT);
}
或者您可以创建一个自定义 HandlerInterceptor
但是拦截器发生在请求被映射到特定的 Controller.action
之前,您无法知道该上下文中的 Controller 和操作。
您所拥有的只是 HTTPServlet API 和请求+响应;所以你可以:
response.sendRedirect("http://example.org/whitout-trailing-slash");
你不想看的答案
在考虑 HTTP 时,这种行为(带有斜杠的 URL = 没有斜杠的 URL)是完全“有效的”。至少这是 Spring 的默认行为,您可以使用 useTrailingSlashMatch
( see javadoc ) 禁用它。
因此在前端服务器上使用重写/重定向规则可能是一个解决方案;但同样,我不知道您的限制(也许您可以详细说明一下,我们可以找出其他解决方案?)。
关于java - 如何将带有斜杠的 URL 重定向到没有斜杠的相应 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8711392/