您的位置:首页 > 其它

(crm笔记2-5)用户登录问题之验证账户

2017-10-06 16:13 513 查看

用户登录问题之验证账户

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.g
d9d9
etAttribute("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";//返回登录页面
}


至此就所有登录信息验证部分就成功了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  crm
相关文章推荐