YangMVC教程-如何实现用户登录

来源:互联网 发布:数据可视化 地图 编辑:程序博客网 时间:2024/06/07 00:49

登录逻辑

为了实现登陆功能,应当弄清楚一下问题:其一,用户如何将他的用户名和密码提供给系统。其二,系统如何接受用户发来的信息。其三,如何通过数据库查询进行账户的验证。其四,如何使得系统记住登陆状态。其五,登陆后如何获取当前登陆用户的信息。下面将逐一解决上述问题。

  • 其一,对于Web应用,一般使用一个表单(Form)收集用户的信息。在用户访问登陆网页时,提供一个表单给用户,允许用户输入用户名和密码,这个表单还包含一个提交按钮。用户点击提交按钮时,信息就会自动的发送给标签的action属性指定的网页中。提交方式由的method属性决定,一般为Post方式。

  • 其二,用户发来Post请求后,JSP页面可以通过request.getParameter函数获取表单的值。该函数要求一个参数,这个参数就是表单中标签的name属性制定的。对于YangMVC来说,使用param、paramInt等函数都可以获取参数。

  • 其三,YangMVC通过Model和DBTool可以方便的进行数据库查询。首先在用户表中查找与用户名相匹配的记录,如果找不到说明用户名不存在。如果找到了,匹配用户在表单中传来的密码和数据库中的密码是否一致。如果一致说明登陆成功,否则说明密码失败。

  • 其四,在Web应用中,通常使用Session来存储登陆信息。Session相当于一个Map,可以向其中放入一个映射如 session.setAttribute(“uid”,”3333”); 这条语句在session中存储了用户id为3333。以此记录用户信息。

  • 其五,在上述例子中,uid这个session中的键值对在程序中只有登陆成功时才会写入,也就是说,如果没登陆则这个值应不存在或为null。那么判断这个值是否为空就可以判断出用户是否登录。如果登陆了,因为session中存储了用户的id,这样就可以通过查询数据库的方式获取该用户所有信息。在页面上显示一个登陆用户的用户名就是个很简单的问题了。

解决完上述五个问题,登陆就很容易实现了。

登陆表单

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPE html><html><head>    <title>登陆</title>    <meta charset='utf-8' />    <style type="text/css">        html,body{            width:100%;            height:100%;            margin:0px;            padding:0px;        }        body{            display: flex;            justify-content:center;            align-items:center;        }        .box{            width:400px;            height:300px;            display:flex;            flex-direction:column;            align-items:center;        }        .txt{            display: block;            width:400px;            height:60px;            margin:0px;            border: 2px solid #8AC007;            margin-bottom: 10px;            border-radius:10px;            padding-left: 10px;            font-size:20px;            color:green;        }        .sb{            display: block;            width:100%;            height:60px;            margin:0px;            border-radius:10px;            font-size:30px;        }        .title{            font-size:40px;        }    </style></head><body><div class='box'>    <div class='title'>登陆</div><div>${msg}</div>    <form action="" method="post">        <input class='txt' type='text' placeholder="用户名" name="usr" value="${usr }">        <input class='txt' type='password' placeholder="密码"          name="pwd"  value="${pwd }">        <input class='sb' type='submit' value="确定">         </form></div></body></html>

在org.demo中建立UsrController类,内容如下。

package org.demo;import org.docshare.mvc.Controller;public class UsrController extends Controller {    public void login(){        render();    }}

数据库的用户表

数据库是以实体(或称对象)来划分数据表的,不是以动作划分的。所以,不应有什么注册表、登录表等表格。用户的登陆、注册、修改个人信息、修改密码、取回密码等操作都应当是针对用户表的。在mvc_demo这个数据库中加入用户表,该表创建语句如下:

CREATE TABLE `usr` (  `id` int(11) NOT NULL auto_increment,  `uname` varchar(50) default NULL,  `pwd` varchar(50) default NULL,  PRIMARY KEY  (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

该表有三个字段,分别为自动增长的主键id,字符串类型的用户名pwd,字符串类型的密码。真正项目中用户表会有很多其他字段,诸如生日、所在地、性别等信息,但这些信息都和登陆无关,所以这里做了简化处理,用户可以自行添加需要的字段。

随后,添加若干条记录。
为了加速查询,可以为uname字段建立索引。

ALTER TABLE `usr`ADD INDEX `uname` (`uname`);

至此数据库准备完毕。

提交处理

因为表单中action为空,那么就要用登陆页面同URL的页面来处理请求。如上述页面的访问地址是 http://localhost:8080/usr/login ,所以仍然提交给这个页面。整个登陆过程是两次请求和响应。第一次是Get请求,服务器响应为一个登陆表单,第二次是用户点击登录按钮触发,浏览器发出了Post请求,服务器收到该请求后,处理登陆并返回结果。
在本例中,使用UsrController的login方法来处理这两个不同功能的请求,那么就要进行区分。YangMVC提供了一个isPost方法判断是否为Post请求,如果是则返回真,否则返回假。那么将login代码改为:

package org.demo;import java.util.List;import org.docshare.mvc.Controller;import org.docshare.orm.DBTool;import org.docshare.orm.Model;public class UsrController extends Controller {    public void login(){        if(isPost()){            DBTool tool = Model.tool("usr");            String uname = param("usr");            String pwd = param("pwd");            List<Model> list = tool.all().eq("uname", uname).toArrayList();            if(list.size() == 0){                put("usr", uname);                put("pwd", pwd);                put("msg","用户名不存在");            }else{                Model model = list.get(0);                if(pwd!=null && pwd.equals(model.get("pwd"))){                    //succ                    sess("uid",""+model.get("id"));                    jump("home");                    return;                }else{                    put("usr", uname);                    put("pwd", "");                    put("msg","密码不正确");                }            }        }        render();    }    public void home(){        output("this is homepage ,todo");    }}

首先使用param获取表单中的用户名和密码,使用DBTool查询数据库中用户名为相应用户名的记录,如果不存在则使用put函数将“用户不存在”这个消息加入request域。这个分支随后会执行render函数。 如果存在该用户,则进行密码匹配,如果匹配则使用sess函数将该用户的主键id写入Session,并跳转到当前目录的home页。需要注意的是,下面有一个return语句,表示直接退出程序。如果没有这一句,会继续执行render函数,这样就会引发错误。 如果密码不匹配,则将该字符串put到request域。在jsp中,${msg}将输出这个信息,用户停留在登陆页上。

原创粉丝点击