【问题标题】:Struts 2.0.14 GET parametrs are not URLDecoded, is that a bug?Struts 2.0.14 GET 参数不是 URLEncoded,这是一个错误吗?
【发布时间】:2010-12-10 18:23:18
【问题描述】:

我在url中传递的参数有问题。

假设请求是:/struts/MyAction.action?param=foo%40bar.com

操作字段将“param”字段设置为“foo%40bar.com”, 这是一个错误还是我对 Struts 的期望过高?

我的直觉告诉我应该得到值:“foo@bar.com”,例如,如果我将该参数作为 POST 表单字段传递,就会发生这种情况。

我正在使用默认拦截器堆栈,并且我的操作类扩展了 ActionSupport。我在 WebSphere6.1 和 GlassFish2.1 上得到了一些行为。

谢谢


你好,

问题是由代理实现中的错误引起的。我们编写了一个自定义代理服务器,它位于 Web 应用程序的前面。它第二次对 URL 参数进行编码,这就是为什么在 Struts 中我使用 %40 而不是 @。 现已修复Bug,参数传递正确。

感谢大家的帮助

【问题讨论】:

    标签: java struts2 get decode urldecode


    【解决方案1】:

    我不认为 Struts2 负责解码参数,而是 servlet 容器是例如Tomcat、Jetty 等。

    【讨论】:

      【解决方案2】:

      你的直觉是对的,你应该得到“foo@bar.com”。通过以下对 struts 版本 2.0.14 的测试,我可以将 !@#$#$^$&%#$%& 输入 from 并将其显示在另一个页面上而不会出现问题。

      我用一个带有字符串的表单测试了一个简单的 struts 2.0.14 应用程序:

      <s:form action="form-view.action" method="GET">
        <s:textfield label="email" name="email"/>
        <s:submit/>
      </s:form>
      

      一个基本的动作类(注意这个版本的 stuts2 你不需要 setter/getter):

      package struts2;
      
      import com.opensymphony.xwork2.ActionSupport;
      
      public class FormViewAction extends ActionSupport{
         public String email;
      }
      

      还有一个非常基本的显示页面,其中包含:

      <s:property value="email"/>
      

      这里是struts.xml:

      <struts>
        <constant name="struts.enable.DynamicMethodInvocation" value="false" />
        <constant name="struts.devMode" value="true" />
        <package namespace="" name="example" extends="struts-default">
          <action name="form-view"  class="struts2.FormViewAction">
            <result>/form-view.jsp</result>
          </action>
        </package>
      </struts>
      

      一定有配置问题...你是用 maven 构建的吗?你为什么使用版本 2.0.14 而不是 2.2.1?顺便说一句,我将测试应用程序从 2.2.1 降级到 2.0.14,这花了我大约 5 分钟的时间。我认为升级到当前版本不会有任何严重障碍,这将为您提供最新的文档。

      我在 Glassfish 3.0.1 上运行了这个。

      如果您不是使用 maven 构建,请列出您的库中的 jars、您的 web.xml 和 struts.xml 文件,如果可能的话,列出最小的 form.jsp、display.jsp 和一个 Action 类来重现该问题。

      【讨论】:

      • 您应该使用 getter 和 setter,而不是将字段公开。这只是 Java 中的一般最佳实践。
      • 使用 struts 你应该在验证方法中进行验证,getter 和 setter 应该只做 get/set,参数约束也在其他地方处理......动作中的类很薄,所以你不需要太多的绝缘(并且使用 IDE 重构真的很容易)。总的来说,这是一个好主意,但是我执行操作的方式带来的好处似乎很抽象,而不添加它们可以提高可读性。 OT 仅供参考,hibernate 甚至可以允许设置私有字段(通过字节码重写)谈论异国情调!我同意 get/set 是“最佳实践”,但并不总是最好的。
      • 嗨,这实际上不是表单,而是生成的电子邮件中的操作链接。类路径似乎没问题,我们在日志中没有得到令人担忧的输出。我会试试 Struts 2.2.1 看看它是否有任何改变
      • 这是一个表单,生成的电子邮件是在未填写表单的情况下调用视图的情况。我删除了“生成的电子邮件”默认值并添加了格式不正确的“显示页面”,因此它以前没有显示。在上面的确切示例中,我确实在该表单中输入了“!@#$#$^$&%#$%&”,它在 URL 中显示了 URL 编码字符串,并在结果页面上正确显示。
      【解决方案3】:

      您的参数有什么问题?您希望将 param 字段设置为什么?

      如果您希望 Action 属性的转换方式与 Struts 的转换方式不同,您可以编写自定义类型转换器。

      【讨论】:

        【解决方案4】:

        正如 rado 所指出的,Servlet Container 负责解码HttpServletRequest 中的参数值。如果您的值没有被 URL 解码,那么有问题。

        Servlet Tutorial: Handling Form Data

        首先,您使用的是哪个版本的 Servlet API? 2.5? 2.4?您是否在 web.xml 中为您使用的版本定义了正确的 XSD 架构?此外,请检查您使用的版本是否与您的应用程序服务器提供的版本相匹配。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-18
          • 2012-03-25
          • 2010-12-22
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多