(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";//返回登录页面 }
至此就所有登录信息验证部分就成功了。
相关文章推荐
- H3C交换机dot1X+AD+IAS+CA配置实验五(解决用户尚未登录无法验证问题)
- CAS单点登录之mysql数据库用户验证及常见问题
- 在安装discuz!nt时,数据库用户登录失败的问题时,sql server 2008 数据库更改登录模式(sql server 2008 混合登陆中SqlServer身份验证用户名密码)
- servlet学习笔记3——用户登录网站(通过session验证登陆用户)
- JFinal学习笔记(三) 过滤器实现用户登录验证
- PHP验证用户登录例子-学习笔记
- H3C交换机dot1X+AD+IAS+CA配置实验五(解决用户尚未登录无法验证问题)
- Django笔记---用户注册和登录验证(1)--Post请求
- servlet学习笔记3——用户登录网站(通过session验证登陆用户)
- QTP实例:新增用户实例,包含邮箱、手机号码的验证,还判断了添加账户是否已存在数据库的问题
- AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
- mysql登录用户验证遇到的问题 access denied for user ‘user’@'localhost'
- Android基础学习总结(十二)——利用Bmob实现用户账户体系(注册、登录、验证等)
- thinkphp框架模块部署,验证用户登录问题
- H3C交换机dot1X+AD+IAS+CA配置实验(解决用户尚未登录无法验证问题)
- asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功。请重试。 Login控件
- servlet学习笔记4——用户登录网站(数据库验证)
- Django学习笔记4 用户注册和身份验证、登录、注销、注册
- 解决Linux系统安装后,root用户无法登录,提示“无法验证用户”的错误问题
- asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功。请重试。 Login控件