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



      至此就所有登录信息验证部分就成功了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值