java - 如何将带有斜杠的 URL 重定向到没有斜杠的相应 URL?

标签 java spring spring-mvc redirect model-view-controller

Spring MVC (3.0) 将带有和不带有斜杠的 URL 视为相同的 URL。

例如:

http://www.example.org/data/something = http://www.example.org/data/something/

我需要用尾部斜杠重定向 URL

http://www.example.org/data/something/

到没有它的 URL:

http://www.example.org/data/something

我需要在应用程序内部执行此操作(因此不要通过 Apache 等重写规则)。

一种方法是:

@ResponseStatus(value=HttpStatus.MOVED_PERMANENTLY)
@RequestMapping(value = "/data/something/")
public String dataSomethingRedirect(...) {
    return "redirect:/data/something";
}

但这通常有两个问题:

  1. Controller 过多
  2. 参数问题:比如错误的编码

问题

有没有办法拦截所有的 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/

相关文章:

java - 使用Spring Cache缓存一个大的值并用它输出一个较小的值?

java - 实时图表绘制开始时间

java - 如何从 Controller 发送参数以使用thymeleaf查看和显示

spring - 使用 Hibernate 和 Spring MVC 的 JSP

java - 如何从Web项目内的文件夹(WebContent/images/isilog.gif)获取图像文件URL?

spring - 在表单外显示 Spring 表单错误

每次我停止点击时,Java 点击计数器都会重置

java - 如何检查 Java 程序是否保持打开文件句柄?

java - 如何在单元测试中在ApplicationRunner之前运行代码?

java - spring servlet url-pattern 映射不适用于星号