表單的驗證:客戶端驗證和服務器端驗證


 

表單的驗證:客戶端驗證和服務器端驗證

 

表單的確認

客戶端確認:

  減少服務器負載

  縮短用戶等待時間

  兼容性難

服務器端確認:

  統一確認

  兼容性強

  服務器負載重

 

客戶端驗證例子

  首先建立一個表單,在其提交時用JavaScript方法進行驗證,若該方法返回true,則進行表單的提交,若返回false,則表單不提交。

 

      <!-- 表單提交時執行JavaScript方法validate(),如果該方法返回false,那么表單是不會提交的 -->
    <form onsubmit="return validate()" action="servlet/ValidateServlet">
    username:<input type="text" name="username" id="username1"><br>
    password:<input type="password" name="password" id="password1"><br>
    re-password:<input type="password" name="repassword" id="repassword1"><br>
    <input type="submit" value="submit">
    </form>

 

  其中用於驗證的JavaScript方法如下:

<script type="text/javascript">
        function validate()
        {
            //第一種方式:通過ID獲取元素
            // var username = document.getElementById("username1");
            // var password = document.getElementById("password1");
            // var repassword = document.getElementById("repassword1");
            
            //第二種方式:通過名字獲取
            var username = document.getElementsByName("username")[0];//因為允許名字重復
            var password = document.getElementsByName("password")[0];
            var repassword = document.getElementsByName("repassword")[0];
            
            //判斷用戶名是否為空
            if("" == username.value)
            {
                //判斷語句也可以寫: username.value.length == 0
                alert("username can't be blank!");
                return false;
                
            }
            
            //密碼和重復密碼內容一樣,長度在6到10之間
            
            //先驗證密碼長度
            if(password.value.length < 6 || password.value.length > 10)
            {
                alert("length of password is invalid!");
                return false;
            }
            if(repassword.value.length < 6 || repassword.value.length > 10)
            {
                alert("length of repassword is invalid!");
                return false;
            }
            
            //再驗證重復密碼和密碼是否相同
            if(password != repassword)
            {
                alert("password and repassword don't match!");
                return false;
                 
            }
            
            //通過重重考驗后返回true,進行表單提交
            return true;
        
        }
    </script>

  在驗證有誤的時候,彈出對話框提示,並且返回false,不提交表單。

  完整的login.jsp如下(在客戶端驗證的時候可以先不管轉向的Servlet):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <script type="text/javascript">
        function validate()
        {
            //第一種方式:通過ID獲取元素
            // var username = document.getElementById("username1");
            // var password = document.getElementById("password1");
            // var repassword = document.getElementById("repassword1");
            
            //第二種方式:通過名字獲取
            var username = document.getElementsByName("username")[0];//因為允許名字重復
            var password = document.getElementsByName("password")[0];
            var repassword = document.getElementsByName("repassword")[0];
            
            //判斷用戶名是否為空
            if("" == username.value)
            {
                //判斷語句也可以寫: username.value.length == 0
                alert("username can't be blank!");
                return false;
                
            }
            
            //密碼和重復密碼內容一樣,長度在6到10之間
            
            //先驗證密碼長度
            if(password.value.length < 6 || password.value.length > 10)
            {
                alert("length of password is invalid!");
                return false;
            }
            if(repassword.value.length < 6 || repassword.value.length > 10)
            {
                alert("length of repassword is invalid!");
                return false;
            }
            
            //再驗證重復密碼和密碼是否相同
            if(password != repassword)
            {
                alert("password and repassword don't match!");
                return false;
                 
            }
            
            //通過重重考驗后返回true,進行表單提交
            return true;
        
        }
    </script>

  </head>
  
  <body>
      <!-- 表單提交時執行JavaScript方法validate(),如果該方法返回false,那么表單是不會提交的 -->
    <form onsubmit="return validate()" action="servlet/ValidateServlet">
    username:<input type="text" name="username" id="username1"><br>
    password:<input type="password" name="password" id="password1"><br>
    re-password:<input type="password" name="repassword" id="repassword1"><br>
    <input type="submit" value="submit">
    </form>
  </body>
</html>
login.jsp

 

  但是客戶端的驗證是不可靠的,用戶可以查看源代碼,找到表單action的Servlet,然后轉向這個地址,將參數用?連接在地址之后,這時候參數是沒有經過客戶端校驗的

 

服務器端驗證例子

  從表單中獲得參數:JSP通過request內置對象獲取表單信息,用不同的方法獲取不同種類的信息。

  服務器端驗證程序,先將客戶端驗證部分去掉,即去掉 表單中的:onsubmit="return validate()"

  那么用戶在表單中提交的數據將直接傳到服務器端,服務器端Servlet對其進行驗證:

  方式如下:有錯誤時將錯誤信息放在一個String類型的List中,最后判斷這個List是否為空,如果為空,轉向驗證成功頁面;如果List不為空,則轉向失敗頁面,顯示錯誤信息。

 

package com.shengqishiwind.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



public class ValidateServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String repassword = req.getParameter("repassword");
        
        List<String> list = new ArrayList<String>();
        if(null == username || "".equals(username))
        {
            list.add("username can't be blank!");
        }
        
        if(null == password || password.length()<6 || password.length()>10)
        {
            list.add("password should be between 6 and 10");
        }
        if(null == repassword || repassword.length()<6 || repassword.length()>10)
        {
            list.add("repassword should be between 6 and 10");
        }
        
        if(null != password && null != repassword && !password.equals(repassword))
        {
            list.add("password and repassword don't match!");
        }
        
        //有兩種結果:驗證通過和不通過
        if(list.isEmpty())
        {
            req.setAttribute("username", username);
            req.setAttribute("password", password);
            req.getRequestDispatcher("../success.jsp").forward(req, resp);
            
        }
        else 
        {
            req.setAttribute("error", list);
            req.getRequestDispatcher("../error.jsp").forward(req, resp);
        }
        

    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {

        this.doGet(req, resp);
    }

}

 

 

  成功頁面JSP body部分:

  <body>
    username:<%= request.getAttribute("username") %><br>
    password:<%= request.getAttribute("password") %><br>
  </body>

 

  失敗頁面:

  <body>
    <h1>login failed</h1>
    <% List<String> list = (List<String>)request.getAttribute("error");
    for(String str: list)
    {
        out.println(str+"<br>");  
    }
    %>
  </body>

 

 

 

參考資料

  聖思園張龍老師Java Web培訓視頻022。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM