struts2之輸入驗證
阿新 • • 發佈:2018-02-19
tran submit -a ror cache entity art sta 1.0
輸入校驗主要分為兩種:
基於客戶端的校驗:
客戶端校驗主要作用是防止正常瀏覽者的誤輸入,僅能對輸入進行初步過濾;對於一些用戶惡意行為,客戶端校驗則無能為力。
基於服務端的校驗:
服務器接收客戶端提交的數據,對這些數據的合理性、安全性等進行進一步的判斷處理。
1、重寫validate方法
註冊action:
package com.action; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;import entity.User; // 封裝頁面註冊信息 public class ValidateAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }/** * 重寫validate方法 * 僅能針對execute()做輸入校驗 */ @Override public void validate() { System.out.println(user.getName()); // 放入上下文中,頁面可以通過${name }獲取,在註冊不成功時,讓用戶知道自己之前輸錯的信息 ActionContext.getContext().put("pwd", user.getPwd()); ActionContext.getContext().put("name", user.getName()); ActionContext.getContext().put("age", user.getAge()); // 驗證規則 if(user.getName() != null || "".equals(user.getName().trim())){ if (user.getAge() < 18 || user.getAge() > 30) { this.addFieldError("errorMsg", "年齡必須在18到30歲"); } if(Pattern.compile("^1[358]\\d{3}$").matcher(user.getPwd()).matches()){ this.addFieldError("errorMsg", "密碼不合規"); } } } }
reg.jsp頁面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP ‘reg.jsp‘ starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <h2>使用${fieldErrors[‘errorMsg‘][0]}這種方法顯示驗證信息,在於action中賦值 this.addFieldError("errorMsg", "年齡必須在18到30歲"); </h2> <s:fielderror></s:fielderror> <form action="vaildate.action" method="post"> 用戶名: <input type="text" name="user.name" value="${name }"> 密碼: <input type="password" name="user.pwd" value="${pwd }"> 年齡: <input type="text" name="user.age" value="${age }"> <input type="submit" value="註冊"><h5>${fieldErrors[‘errorMsg‘][0]}</h5> </form> <h2>另一種顯示校驗信息: 使用struts標簽,必須通過過濾器,故在web.xml配置jsp過濾規則,以下是struts標簽顯示驗證信息</h2> <s:property value="fieldErrors[‘errorMsg‘][0]"/> <h2>使用debug標簽</h2> <s:debug></s:debug> </body> </html>
struts.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "struts-2.3.dtd" > <struts> <!-- 熱部署 --> <constant name="struts.configuration.xml.reload" value="true"></constant> <!-- 動態方法調用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <package name="hello" namespace="/" extends="json-default"> <!-- 註冊的action --> <action name="reg" class="com.action.RegAction" method="reg"> <result name="success">/index.jsp</result> </action> <!-- 驗證的action --> <action name="vaildate" class="com.action.ValidateAction"> <!-- 驗證通過 ,回到主頁面--> <result name="success" type="chain"> <param name="actionName">reg</param> </result> <!-- 驗證不通過,回到註冊頁面,顯示驗證信息 註意這裏的 input屬性,否則會報錯 --> <result name="input">/reg.jsp</result> </action> </package> </struts>
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>struts2</display-name> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <!-- 配置jsp頁面的過濾,使其可以使用struts標簽 --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
2、重寫validateXxx方法
由於validate()方法只能對execute()進行輸入校驗,對於實際業務需求,我們需要根據對不同的方法做輸入校驗。
Struts2提供了一個validateXxx()方法,Xxx即是Action對應的處理邏輯方法名。
action類:
public class ValidateUserAction extends ActionSupport { private String message; private String account;//用戶賬號 private String password;//用戶密碼 //用戶登錄 public String login(){//具體業務操作內容省略} public void validateLogin(){ //用戶輸入的賬號長度為6~12位,不允許有空格 if(!account.matches("^[^ ]{6,12}$")){ this.addFieldError("account", "賬號長度6~12位,不允許出現空格"); } if(!password.matches("^[^ ]{6,15}$")){ this.addFieldError(“password", "密碼長度6~15位,不允許出現空格"); } } }
action配置:
<action name="validateUser" class="com.pxy.struts.action.ValidateUserAction"> <result name="input">/login.jsp</result> <result name="login">/success.jsp</result> </action>
常用的登錄正則驗證
//郵箱正則表達式 String emailRegex="\\b^[‘_a-z0-9-\\+]+(\\.[‘_a-z0-9-\\+]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2}|aero|arpa|asia|biz|com|coop|edu|gov|info|int|jobs|mil|mobi|museum| name|nato|net|org|pro|tel|travel|xxx)$\\b"; //身份證號正則表達式 String idCardRegex="(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])"; //手機號正則表達式 String phoneNoRegex="^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
struts2之輸入驗證