Struts2排除模式 - 它是如何工作的?

3
我正在尝试将一个Struts2应用程序(版本2.2.1.1)迁移到Spring MVC,但我在将struts.xml映射转换为SpringMVC servlet映射方面遇到了困难。
我的第一个问题是Struts2排除模式的确切工作方式。假设在我的web.xml中,我已经设置了一个过滤器/映射来处理struts2,如下所示:
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

在我的struts.xml文件中,我已经定义了一些可用的动作。现在根据Struts2文档的理解,自从Struts 2.1.7版本以来,你可以提供一个逗号分隔的模式列表,当匹配请求URL时,过滤器将会忽略这些模式。这是通过配置选项struts.action.excludePattern实现的,例如在您的struts.xml中。如果我添加了一个排除模式,例如:
<constant name="struts.action.excludePattern" value="/*"/>

那么过滤器应该被绕过,上述操作不应该被解决,对吗?

出于某种原因,这种情况没有发生,所有我的操作仍然被正确路由。

是什么原因呢?

3个回答

6

struts的值必须遵守java.util.regex.Pattern类的标准。 http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

因此,如果您想要避免所有/rest/* url,例如:

/rest/[a-zA-Z_0-9]*

如果您需要处理具有多个参数的REST Web服务:

/rest/[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*

为了测试您的模式,您可以使用以下代码:
Pattern pattern = Pattern.compile("/rest/[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*");
String uri = "/rest/users/1/1";
System.out.println(pattern.matcher(uri).matches());

5

谢谢你的回答 Dave。我并不是想排除所有东西,我只是想了解这个功能是如何工作的。我正在将一个应用程序迁移到 Spring-MVC,并希望同时运行 Struts2 / Spring-MVC。我发现我的问题实际上与我正在使用的 struts 过滤器有关。我稍后会发布详细信息。 - Zachary Carter

0
我对之前的回答有一个补充。你可以按照这里所述来定义排除项。
但是,文档中似乎存在一个错误。如果你需要转义点号'.',你只需要使用一个反斜杠即可:
<struts>
<constant name="struts.action.excludePattern" value=".*unfiltered.*,.*\.nofilter"/>
...
</struts>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接