1. 程式人生 > >struts2之輸入驗證

struts2之輸入驗證

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之輸入驗證