【问题标题】:Combining UrlRewriteFilter and struts 2 with get parameters将 UrlRewriteFilter 和 struts 2 与 get 参数结合使用
【发布时间】:2010-10-06 21:56:35
【问题描述】:

跟进我的一个较早的问题,我设法让 URL 重写在我的 struts 项目中正常工作,其中像 search?q=blah 这样的 URL 被转换为查询 search.action?q=blah。我们为此使用UrlRewriteFilter。这似乎可以很好地转发到 struts(如果确保它具有与 FORWARD 的过滤器映射),但是当 ParametersIntercepter 运行时,它似乎会捕获每个参数两次,并在其间添加逗号。所以如下:

search.action?q=blah

将 Criteria 对象上的参数 q(见进一步)设置为:

[ blah, blah ]

参数是使用ModelDriven<Criteria> 设置的,其中 Criteria 是一个简单的类,其中包含要从 GET 字符串设置的一组属性。

我不知道为什么会发生这种情况。有没有人见过这样的事情?我在过滤器/拦截器方面做错了吗?

编辑:似乎ParametersInterceptor 只是设置了包含在 ActionContext 对象中的参数。我不确定(并且没有看到任何指示的调试消息)这些值在 ActionContext 中的设置位置。有谁愿意澄清这一切应该如何工作?

【问题讨论】:

    标签: java jakarta-ee url-rewriting struts2 model-driven


    【解决方案1】:

    我还没有解决上面的奇怪行为,但我设法在 url 重写中发现了一个错误,页面没有被重定向到“mySearch.action”而是“mySearch.action?”。现在使用带有固定规则且不包括查询参数的 url 重写似乎可以正常工作。

    编辑: 我最终将此追溯到设置为同时侦听 REQUEST 和 FORWARD 的 urlrewritefilter 的问题。显然这会导致 GET 参数被解析两次。但是,我仍然不包括查询参数(因为这通常会使事情混淆),因此这可能无法完全解决问题。不过,这很可能是罪魁祸首。

    特别是,我的过滤器映射现在看起来像:

    <filter-mapping>
         <filter-name>UrlRewriteFilter</filter-name>
         <url-pattern>/*</url-pattern>
         <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    

    【讨论】:

      【解决方案2】:

      以防万一您可能仍然对额外的信息感兴趣,您是否知道最新版本的 Struts2(即 2.1.?)不会将扩展名 .action 强加到您的操作中?事实上,你根本不需要任何扩展!

      如果我没记错的话,唯一的要求是,在 web.xml 中,将 Struts2 过滤器 (org.apache.struts2.dispatcher.FilterDispatcher) 映射到 url-pattern:/*

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

      从那时起,出现在扩展名为空的页面上的&lt;s:url&gt;标签将依次生成一个没有扩展名的url...

      【讨论】:

      • 我有点意识到,但我认为您需要在配置中将扩展名设置为空。但在我们的例子中,这并没有真正解决它,因为我们正在重定向所有类型的类似 rest 的 url,这些 url 并不总是对应于不同的操作。不过还是谢谢。
      猜你喜欢
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多