Struts 2.0.14 GET参数不是URLEncoded,是不是一个bug?

时间:2010-12-10 18:23:18

标签: java struts2 get decode urldecode

我对网址传递的参数有疑问。

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

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

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

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

由于


嗨再次,

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

感谢您的帮助

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

你的直觉是对的,你应该得到“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 / getters):

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构建,请列出库中的jar,web.xml和struts.xml文件,如果可能的话,列出最小的form.jsp,display.jsp和Action类来重现该问题。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如rado所示,Servlet容器负责解码HttpServletRequest中的参数值。如果您的值未进行URL解码,则表示某些内容已关闭。

Servlet Tutorial: Handling Form Data

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