Struts 2请求参数验证(Int和字符串)

时间:2013-01-18 10:10:51

标签: java jsp validation struts2 url-parameters

假设我在这里有这个网址

<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中输入了一个字母或一个负数),我会将他重定向到另一个页面。

2 个答案:

答案 0 :(得分:2)

您有一个参数字段int,但您已在网址中将其设置为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类型的参数。

对于您的问题:如果您的参数未正确解析,则0方法中的值为execute()。所以,你决定返回什么结果。如果在validate()拦截器之后放置的validation拦截器进行解析,或者在params之后放置GenericValidator.isInt并将其显示在setFieldError()中,您也可以检查{{1}}方法中的值验证后立即进行JSP或重定向。

答案 1 :(得分:1)

ParametersInterceptor,使用XWorkConverter会引发类型异常

  

ognl.MethodFailedException:java.lang.NoSuchMethodException setId(java.lang.String);

因为它会(通过反思)搜索Setter String,而不是int

此错误将停止InterceptorStack中间的调用,并将其与input结果一起发回,这是请求中输入错误的默认结果。

如果您的input中没有声明struts.xml结果,则会出现类型异常

  

没有为行动定义你的.package.your.Action和结果输入

如果你拥有它,那么你将被重定向回你struts.xml中声明的结果(相同的JSP,另一个JSP或一个Action)。

您可以通过JSP中的<s:fielderror />标记输出字段错误来处理此问题,并最终使用javascript对字段进行红色边框着色(不是在您的情况下,因为它们是URL参数)。

要正确验证此类内容(而不是要求Struts2失败并为您引发错误),您可以使用XML Validation,在名为{{1的Action的同一个包中声明XML文件}}

在您的情况下,您应该使用Required ValidatorInt Validator

(并在YourActionName-validation.xml中指定0min个参数,以防止出现负值。