1. 程式人生 > >(crm筆記2-5)使用者登入問題之驗證賬戶

(crm筆記2-5)使用者登入問題之驗證賬戶

使用者登入問題之驗證賬戶

      

1、需求

      先看一下我們的登入頁面

這裡寫圖片描述


      我們需要做的是,將使用者名稱、密碼、驗證碼 傳入到後臺,在後臺進行賬戶驗證是否是資料庫中的合法使用者。如果是,進入menu.jsp頁面,否者,重新回到登入頁面。並提示使用者名稱,密碼,驗證碼等出錯資訊。


2、實現思路

      1)區分驗證資訊的前後關係,首先驗證的是 驗證碼

,其實是使用者名稱密碼

      2)在login.jsp中將獲取到的驗證碼,使用者名稱,密碼等通過request傳到Action.java處理方法中

      3)對於驗證碼:寫一個專門的驗證方法進行驗證是否正確。

      4)對於使用者名稱和密碼:通過呼叫業務層的程式碼,在dao層對資料進行查詢,查詢是否存在使用者名稱和密碼。

      5)對於不同的驗證,在前端jsp頁面不同區域放置:錯誤資訊顯示



3:實現過程

      3.1 看前端的程式碼:

 <TABLE cellpadding="0" cellspacing="0">
 <TR>
    <TD class="td">使用者帳號:</TD><TD class="td">
    <input name="name" type="text" value="" id="name"/></TD>
 </TR>
 <TR>
    <TD class
="td">
登入密碼:</TD> <TD class="td"><input name="password" type="password" value="" id="password"></TD> </TR> <TR> <TD class="td">驗&nbsp;證&nbsp;碼:</TD> <TD class="td"><input name="checkNum" type="text" value="" id="checkNum" style="width: 80"> <img id="checkNumImage" src="${pageContext.request.contextPath}/image.jsp" height="19" align="absmiddle" onClick="changeCheckNum()" title="點選換一張" style="cursor:hand"><s:fielderror fieldName="checkNum"/></TD> </TR> <TR> <TD class="td">記&nbsp;住&nbsp;我:</TD> <TD class="td"><input name="rememberMe" type="checkbox" id="rememberMe" value="yes" class="checkbox" ></TD> </TR> </TABLE>

      設定資訊框的name屬性,因為jsp和java直接的通訊是可以通過request.getParameter(“屬性名”)這個方法傳值的,而方法裡面的值就是name=”“屬性名

然後確定頁面之間的跳轉和Action的呼叫,在“登入”按鈕提交的事件需要進行配置:

<form name="form0" method="post" action="${pageContext.request.contextPath}/sysUserAction_isLogin.do">



      將整個表單交給Action處理,然後開始寫這個處理的方法,有點複雜:

    public String isLogin(){
            ......
            return "main";//首先確定是返回的是main.jsp當然這是登入成功的跳轉,否者跳轉到Login.jsp
    }



      3.2 實現驗證碼的驗證,寫一個工具類,裡面實現驗證的方法:

      通過獲取真實值和登入頁面使用者輸入的驗證碼進行對比,判斷驗證碼對錯(對於驗證碼的生成方法只需要會使用即可)

public static  boolean isCheckNum(HttpServletRequest request) {
    //獲取已經存在的session
    HttpSession session=request.getSession(false);
    if(session==null){
        return false;
    }
    String check_number_key=(String) session.getAttribute("CHECK_NUMBER_KEY");//這裡獲取的是驗證碼中的數字,這個屬性是在專用的驗證碼處理類中定義好的,將一個隨機的數字CHECK_NUMBER_KEY傳入就會生成對應的驗證碼圖片,而這個屬性便是其真實值

    if(StringUtils.isBlank(check_number_key)){
        return false;
    }
    //獲取文字框中輸入的值
    String saved=request.getParameter("checkNum");
    if(StringUtils.isBlank(saved)){
        return false;
    }

    //比對頁面中的值和session的值
    return check_number_key.equalsIgnoreCase(saved);
}



      3.3 驗證使用者名稱和密碼

public String isLogin(){

        ......

//處理使用者名稱和密碼是否輸入正確
String name=request.getParameter("name");
String password=request.getParameter("password");

SysUser sysUser= sysUserService.findSysUserByNameAndPassword(name,password);
//驗證資訊
if(sysUser==null){
    return "login";
    }
        return "main";
}



1)業務層

    /**
     * 通過使用者名稱和密碼查詢使用者
     * @param name
     * @param password
     * @return
     */
    @Override
    public SysUser findSysUserByNameAndPassword(String name, String password) {
        if(StringUtils.isNotBlank(name)&&StringUtils.isNotBlank(password)){
            String whereHql=" and o.name=? and o.password= ?";
            Object []params={name,password};
            List<SysUser>list= sysUserDao.findObjectByConditionWithNoPage(whereHql, params);
            if(list!=null&&list.size()==1){
                return list.get(0);
            }
        }
        return null;
    }

      組織查詢語句,將使用者名稱和密碼傳入查詢語句中。呼叫dao進行資料庫查詢。


2)dao層

@Override
    public List<T> findObjectByConditionWithNoPage(String whereHql,final Object[] params ,LinkedHashMap<String, String>orderby) {
        //獲取hql語句select前半部分
        String hql="select o from "+entityClass.getSimpleName()+" o where 1=1 ";

        if(StringUtils.isNotBlank(hql)){
            hql+=whereHql;//加入接收到的where部分
        }

        final String fhql=hql;

        //呼叫hibernate中的方法執行query語句
        @SuppressWarnings("unchecked")
        List list=(List<T>)this.getHibernateTemplate().execute(new HibernateCallback(){
            @Override
            public Object doInHibernate(Session session)throws HibernateException, SQLException {
                Query query=session.createQuery(fhql);
                if(params!=null&&params.length>0){
                    for(int i=0;i<params.length;i++)
                        query.setParameter(i, params[i]);
                }
                return query.list();
            }
        });
        return list;
    }



4、錯誤資訊Jsp頁面顯示

這裡寫圖片描述


1)前端頁面

      這時候要對前端的頁面新增一些資訊顯示區域:

<TD class="td">驗&nbsp;證&nbsp;碼:</TD>
<TD class="td"><input name="checkNum" type="text" value="" id="checkNum" style="width: 80">
<img id="checkNumImage" src="${pageContext.request.contextPath}/image.jsp" height="19" align="absmiddle" onClick="changeCheckNum()" 
           title="點選換一張" style="cursor:hand"><s:fielderror fieldName="checkNum"/></TD>



      在後面加一段:

<s:fielderror fieldName="checkNum"/>

      這段區域用來顯示錯誤資訊。



      同理在使用者名稱和密碼的輸入框後面也加入類似的框:

<s:fielderror  fieldName="name"/>//記得改filedName



      當然在使用這個區域首先需要引入struts2的標籤庫:

<%@ taglib uri="/struts-tags" prefix="s"%>//在頁面最頂端新增



2)後臺資訊傳遞

      在Action處理時就需要將錯誤資訊顯示出來了,當驗證碼錯誤或者密碼等:
驗證碼:

        //處理驗證碼,判斷驗證碼是否輸入正確
        boolean flag=SessionUtils.isCheckNum(request);
        if(!flag){
            this.addFieldError("checkNum","驗證碼輸入錯誤,請重新輸入!");//這裡的.addFieldError("checkNum")方法就會在前面設定好的區域顯示資訊
            return "login";
        }

      同理在使用者名稱和密碼錯誤時:

        //驗證資訊,當查詢資料庫失敗,沒有找到這個使用者,使用者為空時:
        if(sysUser==null){
            this.addFieldError("name", "使用者名稱或密碼錯誤!");
            return "login";//返回登入頁面
        }



      至此就所有登入資訊驗證部分就成功了。