Spring - 将一个 URL 重写为另一个

Posted

技术标签:

【中文标题】Spring - 将一个 URL 重写为另一个【英文标题】:Spring - Rewrite one URL to another 【发布时间】:2011-01-20 19:10:21 【问题描述】:

我有一个包含 Flash 横幅的 Spring 2.5 应用程序。我没有 Flash 组件的源代码,但它具有硬编码到以.html 结尾的某些页面的链接我希望能够将这些 .html 页面重定向到现有的 jsp 页面。如何让 Spring 将一些 .html 页面解析为 .jsp 页面?

我的项目如下:

WebContent
 |
 -sample.jsp
 -another.jsp
  WEB-INF
  |
  -myapp-servlet.xml
  -web.xml

我希望localhost:8080/offers.html 重定向到localhost:8080/sample.jsp

我可以用 Spring 做到这一点吗?我已经在 myapp-servlet.xml 中定义了一个 SimpleUrlHandlerMapping 和 UrlFilenameViewController,它们必须继续提供它已经存在的页面。

在我的 web.xml 中,我有

<servlet-mapping>
  <servlet-name>myapp</servlet-name>
  <url-pattern>*.htm</url-pattern>
</servlet-mapping>

更新

这里是 URL 映射器。如果我添加一个控制器,我如何返回 WebContent 目录中的 jsp 视图,因为视图解析器包含 /WEB-INF/jsp 目录。

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
    <props>
      <prop key="/page1.htm">page1Controller</prop>
      <prop key="/page2.htm">page2Controller</prop>
    </props>
  </property>
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
</bean>

【问题讨论】:

UrlFilenameViewController 只会将 URL 的模式解析为文件名,您不能将 URL“映射”到不同的文件。如果要将 /offers.html 映射到视图 sample.jsp,则需要一个控制器来处理 /offers.html 模式并返回 sample.jsp 作为视图。您可以从 myapp-servlet.xml 发布您的 SimpleUrlHandlerMapping 吗? @Rob Beardow - 更新了 SimpleUrlHandlerMapping 和 InternalResourceViewResolver 【参考方案1】:

首先,我假设当您说“重定向”时,您的真正意思是“转发”。 HTTP 重定向在这里不合适。

鉴于此,这里有一些事情可以尝试:

您不能将 JSP 文件从 WebContent 移动到 /WEB-INF/jsp/ 吗?那么,您不必更改 ViewResolver 定义。

您可以尝试让控制器返回类似 ../../another.jsp 的视图名称,并希望 servlet 容器解析为 /WEB-INF/jsp/../../another.jsp/another.jsp

仅当控制器返回视图名称时才会查询ViewResolver。您的控制器必须返回视图的名称,它们可以直接返回 View 对象,在本例中为 JstlView。这可以指向您喜欢的任何 JSP。您可以让一些控制器返回视图名称,而一些控制器则返回 View 对象。

从视图解析器中删除 prefix 属性。这意味着您还必须更改每个现有控制器,为它们返回的每个视图名称添加前缀/WEB-INF/jsp/。然后,您可以按名称引用 WebContent 下的 JSP。

【讨论】:

【参考方案2】:

我认为您可以从 tukey.org 制作的开源 URL 重写库中受益。 SpringSource 的人支持这个库,因为如果你使用 Spring Roo 创建项目,它会自动为你设置,所以它质量很好。我已在多个项目中成功使用它。

查看here 的主页。 Skaffman 是对的,您希望它“转发”而不是重定向,这是默认行为。

在 web.xml 中像这样配置它:

<filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>

然后,在 WEB-INF/urlrewrite.xml 中有这样一个元素:

<rule>
    <from>offers.html</from>
    <to>offers.jsp</to>     
</rule>

【讨论】:

@mirror303 - 谢谢。这非常有效,配置大约需要 10 秒。【参考方案3】:

我会为此使用 OCPsoft PrettyFaces 或 OCPsoft Rewrite:

与PrettyFaces:

创建 WEB-INF/pretty-config.xml

<url-mapping>
   <pattern value="/offers.html" />
   <view-id value="/offers.jsp" />
</url-mapping>

与Rewrite:

ConfigurationBuilder.begin()
   .addRule(Join.path("/offers.html").to("/offers.jsp"));

我希望这会有所帮助。

~林肯

【讨论】:

您还可以通过 rewrite-integration-tukey 模块将现有的 Tuckey 配置与 Rewrite 一起使用。 林肯是OCPsoft的创始人,PrettyFaces和Rewrite的作者。你应该提到你的答案是有偏见的。

以上是关于Spring - 将一个 URL 重写为另一个的主要内容,如果未能解决你的问题,请参考以下文章

删除的功能,不能将一条记录重写为另一条记录,对象

将spring服务列表转换为另一个Entity作为响应

重写 spring-security 重定向 URL

在Java Spring中将一个bean的值设置为另一个bean

如何将重写规则添加到 Spring Boot 2.3.1

将查询参数替换为另一个值/标记