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
到没有它的URL:
我需要在应用程序内部执行此操作(因此不要通过Apache重写规则等).
一种方法是:
@ResponseStatus(value=HttpStatus.MOVED_PERMANENTLY)
@RequestMapping(value = "/data/something/")
public String dataSomethingRedirect(...) {
return "redirect:/data/something";
}
Run Code Online (Sandbox Code Playgroud)
但这通常有两个问题:
有没有办法拦截所有的URL,如果它们有一个尾部斜杠,将它们重定向到没有斜杠的相对URL?
Bri*_*zel 17
如果没有那么多,您可以配置这样的重定向视图
@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)
但是拦截器在请求映射到特定的请求之前发生,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).
因此,在前端服务器上使用重写/重定向规则可以提供解决方案; 但同样,我不知道你的约束(也许你可以详细说明这个,我们可以找出其他解决方案?).
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可以做的一小部分.
问候.
| 归档时间: |
|
| 查看次数: |
19871 次 |
| 最近记录: |