(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">驗 證 碼:</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">記 住 我:</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&¶ms.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">驗 證 碼:</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";//返回登入頁面
}
至此就所有登入資訊驗證部分就成功了。