效果: 

验证码还是没有布局好.背景比较怀古. 

 1.写前端html 
login.jsp

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
    content="width=device-width, initial-scale=1, maximum-scale=1">
<title>登录</title>
<link rel="stylesheet" href="/static/css/layui.css">
<link rel="stylesheet" href="/static/css/login.css">
</head>
<body>
    <div class="clear box layui-main login">

        <form class="layui-form layui-form-pane1" action="ulogin" method="post">
            <div class="layui-form-item">
                <label class="layui-form-label">用户名:</label>
                <div class="layui-input-block">
                    <input type="text" name="user.name" lay-verify="uname" required
                        placeholder="请输入用户名" autocomplete="off" class="layui-input">${UnameErrMsg?if_exists}
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">密码:</label>
                <div class="layui-input-block">
                    <input type="password" name="user.pwd" lay-verify="" required
                        placeholder="请输入密码" autocomplete="off" class="layui-input">${PwdErrMsg?if_exists}
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">验证码:</label>
                <div class="layui-input-block">
                    <input type="text" name="yzm" lay-verify="" required
                        placeholder="请输入验证码" autocomplete="off" class="layui-input">${yzmErrMsg?if_exists}<br>
                <a href="/login.html"><img alt="验证码" src="/yzm"></a>
                </div>
            </div>
            <div class="layui-form-item">
            <label class="layui-form-label"></label>
                <button class="layui-btn layui-btn-normal btn-center" type="submit">登录</button>
            </div>
        </form>
    </div>

    <script src="/static/js/layui.js"></script>
</body>
</html>

登录界面样式

@CHARSET "UTF-8";
body{
    background-image:url(/static/images/login-bg.png);
}
.login {
    padding-top: 15%;
    width: 26%;
}

.btn-center{
    text-center:center;
    margin:0 auto;
}

2.写控制器 
其中就是login方法与ulogin方法 
controller包下IndexController类

package cn.pangpython.controller;

import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.ext.kit.SessionIdKit;

import cn.pangpython.model.User;
import cn.pangpython.utils.DateUtils;
import cn.pangpython.utils.MD5;
import cn.pangpython.validate.RegistValidator;
import cn.pangpython.validate.UserLoginValidator;

/**
 * @author pangPython
 * 主页控制器
 */
public class IndexController extends Controller {
    public void index(){
        renderText("index");
    }

    //渲染注册页面
    public void regpage(){
        render("regist.html");
    }

    //处理注册
    @Before(RegistValidator.class)
    public void regist(){
        String pwd = getPara("user.pwd");
        String confirm = getPara("reg.confirm");

        //验证码验证
        boolean result = validateCaptcha("reg.yzm");
        if(!result){
            setAttr("yzmErrMsg", "验证码错误!");
            render("regist.html");
            return;
        }
        //确认密码验证
        if(!pwd.equals(confirm)){
            setAttr("confirmErrMsg", "请正确填写确认密码!");
            render("regist.html");
            return;
        }

        String uname = getPara("user.name");
        User user = getModel(User.class);
        String reg_time = DateUtils.dateToUnixTimestamp(DateUtils.getNowTime())+"";
        //使用用户注册日期作为md5密码加密的盐值,可节省一个salt数据库字段
        pwd = MD5.GetMD5Code(pwd+reg_time);

        //给user实体类填充数据
        user.setName(uname);
        user.setPwd(pwd);
        user.setRegTime(reg_time);

        //使用jfinal的保存操作
        user.save();

        renderText("注册成功!");
    }

    public void login(){
        render("login.html");
    }

    @Before(UserLoginValidator.class)
    public void ulogin(){
        // 验证码结果
        boolean result = validateCaptcha("yzm");
        if (!result) {
            setAttr("yzmErrMsg", "验证码错误!");
            render("login.html");
            return;
        }

        String uname = getPara("user.name");
        String sql = "select * from user where name = ? limit 1";

        User user = User.dao.findFirst(sql, uname);
        if (user != null) {
            String pwd = MD5.GetMD5Code(getPara("user.pwd") + user.getRegTime());

            if (user.getPwd().equals(pwd)) {

                // 生成唯一标识
                String sessionId = SessionIdKit.me().generate(getRequest());
                // 设置服务器端session
                setSessionAttr(sessionId, user);
                // 设置用户端cookie
                setCookie("cuser", sessionId, 60000);
                //redirect("/user");
                renderText("登录成功!");

            } else {
                // 密码不正确
                setAttr("UnameErrMsg", "用户名或密码不正确!");
                render("login.html");
            }

        } else {
            // 用户名不存在
            setAttr("UnameErrMsg", "用户名不存在!");
            render("login.html");
        }

    }

}

3.写登录验证器 
validator包下的UserLoginValidator继承JFinal的Validator

package cn.pangpython.validate;

import com.jfinal.core.Controller;
import com.jfinal.validate.Validator;

public class UserLoginValidator extends Validator {

    @Override
    protected void handleError(Controller controller) {
        controller.keepPara();

    }

    @Override
    protected void validate(Controller arg0) {
        validateRequired("user.name", "UnameErrMsg", "请输入用户名!");
        validateRequired("user.pwd", "PwdErrMsg", "请输入密码!");
        validateRequired("yzm", "yzmErrMsg", "请输入验证码!");
    }

}

注:验证码的校验也可以在验证器中进行验证 
到此就完成了登录功能.运行config文件,访问

http://localhost/login

原文:https://blog.csdn.net/u012995856/article/details/52927053

posted on 2019-01-20 11:39  wyhluckydog  阅读(288)  评论(0编辑  收藏  举报