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}将输出这个信息,用户停留在登陆页上。
相关文章推荐
- 如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作
- 如何实现单一用户单一机子登录
- 用Python实现web端用户登录和注册功能的教程
- PHP中如何使用session实现保存用户登录信息
- phpcms v9 如何实现用户登录
- 如何使用Shiro实现不同用户登录成功后跳转到不同主页?
- Windows XP 如何修改实现不输入用户密码而直接登录系统
- 用Python实现web端用户登录和注册功能的教程
- Laravel 上手教程之实现用户注册和登录
- Android实战简易教程-第二十三枪(基于Baas的用户注册和登录模块实现!)
- FTP服务器工作原理及如何通过PAM认证实现虚拟用户登录;
- Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录
- C# Winform中如何实现获取当前用户的网络名和登录名【数据库操作】
- 如何实现用户登录
- normal用户同一时间只能有一个登录session,如何实现多个登录?
- [Oracle] 如何使用触发器实现IP限制用户登录
- windows 7如何实现多用户远程登录
- [原]基于CAS实现单点登录(SSO):登录成功后,cas client如何返回更多用户信息
- 如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作
- Python的Flask框架中实现登录用户的个人资料和头像的教程