您的位置:首页 > 其它

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

2017-05-22 11:11 190 查看

登录逻辑

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

其一,对于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}将输出这个信息,用户停留在登陆页上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息