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

Ran*_*ize 21 java model-view-controller redirect spring spring-mvc

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";
}
Run Code Online (Sandbox Code Playgroud)

但这通常有两个问题:

  1. 控制器太多了
  2. 参数问题:喜欢错误的编码

有没有办法拦截所有的URL,如果它们有一个尾部斜杠,将它们重定向到没有斜杠的相对URL?

Bri*_*zel 17

您可以列出Web配置中所需的所有重写规则

如果没有那么多,您可以配置这样的重定向视图

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addRedirectViewController("/my/path/", "/my/path")
      .setKeepQueryParams(true)
      .setStatusCode(HttpStatus.PERMANENT_REDIRECT); 
}
Run Code Online (Sandbox Code Playgroud)

或者您可以创建自定义HandlerInterceptor

但是拦截器在请求映射到特定的请求之前发生,Controller.action并且您无法知道该上下文中的控制器和操作.

你所拥有的只是HTTPServlet API和request + response; 所以你可以:

response.sendRedirect("http://example.org/whitout-trailing-slash");
Run Code Online (Sandbox Code Playgroud)

你不想读的答案

在考虑HTTP时,此行为(具有尾部斜杠的URL =没有它的URL)完全"有效".至少这是Spring的默认行为,你可以禁用它useTrailingSlashMatch(参见javadoc).

因此,在前端服务器上使用重写/重定向规则可以提供解决方案; 但同样,我不知道你的约束(也许你可以详细说明这个,我们可以找出其他解决方案?).

  • "*此行为(带尾随斜杠的URL =没有它的URL)在考虑HTTP时完全"有效".*".不,http:// example.org/blabla`和`http:// example.org/blabla /`(甚至`http:// example.org/blabla //`)是HTTP的不同URL被关注到.许多服务器将它们视为相同,但这是调度机制的实现选择.Apache Httpd默认启用它(`DirectorySlash On`),但这是一个选项. (3认同)

Ger*_*cap 11

我认为你最好选择在进入Spring web的servlet之前使用UrlRewriteFilter.这将确保您的重定向规则不会影响您的控制器.

请注意,您在.war项目中编写规则,而不是在mod_rewrite的apache中编写规则.

googlecode的图书馆项目.

在urlrewrite.xml中写道:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.1//EN" "http://www.tuckey.org/res/dtds/urlrewrite3.1.dtd">
<urlrewrite>
    <rule match-type="regex">  
      <note>Remove trailing slash</note>
      <from>^(.*)/$</from>
      <to type="redirect">$1</to>
    </rule>  
</urlrewrite>
Run Code Online (Sandbox Code Playgroud)

在应用程序的web.xml中,添加:

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
       <init-param>
            <param-name>confPath</param-name>
            <param-value>/WEB-INF/urlrewrite.xml</param-value>
        </init-param>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

请注意,web.xml中过滤器的声明顺序很重要,因此请尝试在spring之前声明此声明.

当然,这只是UrlRewriteFilter可以做的一小部分.

问候.