Struts 2 请求参数验证(Int 和字符串)
Posted
技术标签:
【中文标题】Struts 2 请求参数验证(Int 和字符串)【英文标题】:Struts 2 Request Parameter Validations (Int and Strings) 【发布时间】:2013-01-02 00:37:53 【问题描述】:假设我在这里有这个网址
<s:url action ="profile" var ="profile_url">
<s:param name = "id">$user.userId</s:param>
</s:url>
<s:a href = "%profile_url">My Profile</s:a>
其中参数 id 将只有一个 int
值。所以在我的 Action 类中。
public class ViewProfileAction extends ActionSupport
public String execute()
//someServiceLayer.getUser(id);
return "success";
public int getId()
return id;
public void setId(int id)
this.id = id;
private int id;
只要用户点击链接,一切似乎都很顺利,所以如果用户点击链接,网址将是这样的
localhost:8090/HelloStruts2/profile?id=1
但如果用户直接操作 URL 会怎样?他在浏览器中手动输入了一个字母或字符?像这样
localhost:8090/HelloStruts2/profile?id=b
如果用户这样做了,我肯定会出现异常或错误。
我的问题是如何验证 URL 参数?或者如果用户做了这样的事情(在参数id
中输入字母或负数),我会将他重定向到另一个页面。
【问题讨论】:
如果你确定请告诉我们什么例外。 最好在自定义拦截器中限制篡改 url,然后再点击操作本身,我们应该防止出现问题。 【参考方案1】:您有一个参数字段为int
,但您已在URL 中将其设置为String
。为了消除这种错误,您需要在params
拦截器之前(或之后)放置一些拦截器以检查该值。例如你把validation
拦截器。
@Action(value = "youraction", results =
@Result(location = "/path/to/page.jsp"),
, interceptorRefs = @InterceptorRef("validation"), @InterceptorRef("basicStack"))
那么你需要在你的操作中实现validate()
方法
public void validate()
最后加上会处理错误的方法,也效果不错,所以OGNL不会抱怨
public void setId(String id)
try
this.id = Integer.parseInt(id);
catch (NumberFormatException nfe)
就是这样,您不再有例外,并且在 setter 中检查了 String
类型的参数。
对于您的问题:如果您的参数未正确解析,您将在 execute()
方法中获得 0
的值。因此,您决定返回什么结果。您还可以检查 validate()
方法中的值,如果 validation
拦截器放置在 params
拦截器之后进行解析或 GenericValidator.isInt
在 setFieldError()
之后并在 JSP 中显示或在验证后立即重定向。
【讨论】:
我按照你的建议做了,但是,OGNL 仍然在进行,这是错误 ognl.MethodFailedException: Method "setId" failed for objectorg.hitplay.user.actions.ViewProfileAction.setId([Ljava .lang.String;)] 还有为什么要添加 validate() 方法? 你需要validation
拦截器,setId
,validate()
。最后是一种魔法。这需要验证正常工作。【参考方案2】:
ParametersInterceptor,使用XWorkConverter,会引发类型异常
ognl.MethodFailedException: java.lang.NoSuchMethodException setId(java.lang.String);
因为它会(通过反射)在Setter
中搜索String
,而不是int
。
此错误将在 InterceptorStack 中间停止调用,并将其返回 input
结果,这是请求中输入错误的默认结果。
如果您的struts.xml
中没有声明input
结果,您将获得类型异常
没有为操作 your.package.your.Action 和结果输入定义结果
如果你有它,那么你将被重定向回struts.xml
中声明的结果(同一个 JSP、另一个 JSP 或一个动作)。
您可以通过在 JSP 中通过 <s:fielderror />
标记输出字段错误来处理此问题,并最终使用 javascript 为字段着色(不是您的情况,因为它们是 URL 参数)。
要正确验证这类东西(而不是要求 Struts2 失败并为您引发错误),您可以使用 XML Validation
,在 Action 的同一包中声明一个名为 YourActionName-validation.xml
的 XML 文件
在您的情况下,您应该使用Required Validator 和Int Validator
(并在Int Validator
中将0
指定为min
参数,以防止出现负值)
【讨论】:
你是对的,它返回了那个错误,特别是 ognl.MethodFailedException: java.lang.NoSuchMethodException setId(java.lang.String);它一直在我的控制台上显示,无论如何要删除它?还是不显示? .我只是想删除它。我也忘记了 Validation.xml 不知道它也适用于获取请求。 如果(这不是强制性的)您想要验证来自试图破解(或使用不当)您的 Web 应用程序的人的错误,然后执行此操作。否则,不要这样做。但是,除非您编写自己的拦截器来执行与 ValidatorInterceptor 相同的操作但不打印错误,否则无法避免此错误显示在控制台中……这对我来说没有意义。只需声明一个输入结果并在页面中以漂亮的方式处理它,显示一条消息,例如“哎呀,我检测到你试图破解我的东西......请给我好的参数”。 在阅读了您的评论后,我意识到我认为最好在控制台或记录器中显示此错误以供将来使用。反正我现在觉得有点傻,谢谢!以上是关于Struts 2 请求参数验证(Int 和字符串)的主要内容,如果未能解决你的问题,请参考以下文章