一尘不染

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

jsp

假设我在这里有这个网址

<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),我会将其重定向到另一页。


阅读 203

收藏
2020-06-08

共1个答案

一尘不染

您有一个参数字段,int但已String在URL
中将其设置为。为了消除这种错误,您需要在拦截器之前(或之后)放置一些拦截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){}
}

仅此而已,您也不再例外,并且String在设置器中检查了类型参数。

问题:如果参数解析不正确,则0execute()方法中的值将为。因此,您决定要返回什么结果。您还可以检查validate()方法中的值(如果validation放置在params拦截器之后)或GenericValidator.isInt在拦截器之后进行解析,setFieldError()然后在JSP中显示它或在验证后立即重定向。

2020-06-08