我想重写基于 Struts 2 的应用程序的 URL(当前在开发环境中)。我搜索了它并找到了 Tuckey URL Rewrite 并将其设置在我的项目中。现在我希望我的登录 URL 当前为
http://localhost:8080/MyProject/loadLogin.action
(我在 Struts2 中使用通配符映射)看起来像 http://localhost:8080/login
。
下面是我的配置代码:
struts.xml:
<action name="*Login" method="{1}" class="com.myproject.controller.LoginController">
<result name="login" type="tiles">mylogin</result>
</action>
web.xml:
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
现在这是包含规则的 urlrewrite.xml,我不知道我是否正确配置了规则:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
"http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
<!--
Configuration file for UrlRewriteFilter
http://www.tuckey.org/urlrewrite/
-->
<urlrewrite>
<rule>
<from>^/*</from>
<to type="redirect">/login</to>
</rule>
</urlrewrite>
要重写此 URL
http://localhost:8080/login
,您必须将 urlrewrite 过滤器部署到根上下文。但应用程序正在 /MyProject
上下文中运行。您不能将同一应用程序中的两个过滤器部署到同一上下文来执行所需的操作。
重写 URL 的工作原理:首先访问要显示的 URL,然后 urlrewrite 过滤器搜索规则,如果发现匹配,则执行规则并将请求转发(默认情况下)到为隐藏的新 URL用户。
如果您在
type="redirect"
标签中使用
<to>
,新的 URL 将显示,因为它意味着
匹配此规则的“条件”和“来自”的请求将被 HTTP 重定向。这与做同样的事情:
HttpServletResponse.sendRedirect([to value]))
要重写 URL,您应该使用部署到应用程序根上下文的规则
<rule>
<from>^/login$</from>
<to type="redirect">/MyProject/loadLogin.action</to>
</rule>