效果:

实现了注册界面验证码验证、确认密码、密码md5加盐加密、C3P0插件数据库操作、读取外部配置文件.

1.在注册页面添加了确认密码输入框,修改了字段名称

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="regist" method="POST">
用户名:<input name="user.name" type="text">${nameErrMsg!}<br><br>
密码:   <input name="user.pwd" type="password">${pwdErrMsg!}<br><br>
确认密码:   <input name="reg.confirm" type="password">${confirmErrMsg!}<br><br>
验证码:<input type="text" name="reg.yzm"><img src="/yzm"><br><br>${yzmErrMsg!}
<button type="submit"> 注册</button>
</form>
</body>
</html>

2.在配置类中添加C3P0插件配置 
在config包中MyJFinalConfig类中添加C3P0插件的代码

package cn.pangpython.config;

import javax.print.attribute.standard.Media;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.render.ViewType; import cn.jfinal.model._MappingKit;
import cn.jfinal.routes.AdminRoutes;
import cn.jfinal.routes.FrontRoutes; public class MyJFinalConfig extends JFinalConfig { @Override
public void configConstant(Constants me) {
// 开发模式
me.setDevMode(true);
//这里可以通过配置文件来读取配置参数,更灵活
PropKit.use("SystemConfig.txt");
//指定视图
me.setViewType(ViewType.JSP);
} @Override
public void configHandler(Handlers arg0) {
// 这里可以配置全局处理器,放置直接访问模板文件暴露数据库表和字段 } @Override
public void configInterceptor(Interceptors arg0) {
// 这里可以配置拦截器进行权限管理 } @Override
public void configPlugin(Plugins me) {
// 这里可以配置Jfinal的各种插件,比如数据库插件等
C3p0Plugin c3p0Plugin=createC3p0Plugin();
me.add(c3p0Plugin);
ActiveRecordPlugin arp=new ActiveRecordPlugin(c3p0Plugin);
me.add(arp);
_MappingKit.mapping(arp);
} @Override
public void configRoute(Routes me) {
//这里是配置url由控制器来响应这个请求
//添加前台路由
me.add(new FrontRoutes());
//添加后台路由
me.add(new AdminRoutes());
} //通过读取外部配置文件参数创建C3p0插件
public static C3p0Plugin createC3p0Plugin() {
return new C3p0Plugin(PropKit.get("jdbcUrl"),PropKit.get("user"),PropKit.get("password").trim());
}
}

3.在utils包中引入大牛写的两个工具类 
一个是日期工具类,可以方便获取当前时间并转换成Unix时间戳

package cn.pangpython.config;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin; import cn.pangpython.model._MappingKit;
import cn.pangpython.routes.AdminRoutes;
import cn.pangpython.routes.FrontRoutes; /**
* @author pangPython
* JFinal 项目配置文件
*/ public class MyJFinalConfig extends JFinalConfig { @Override
public void configConstant(Constants me) {
//开启开发模式
me.setDevMode(true);
//这里可以通过配置文件来读取配置参数,更灵活
PropKit.use("SystemConfig.txt");
} @Override
public void configRoute(Routes me) {
//添加前台路由
me.add(new FrontRoutes());
//添加后台路由
me.add(new AdminRoutes());
} @Override
public void configHandler(Handlers arg0) {
// 这里可以配置全局处理器 防止直接访问模板文件暴露数据库表和字段
} @Override
public void configInterceptor(Interceptors arg0) {
// 这里可以配置拦截器进项权限管理
} @Override
public void configPlugin(Plugins me) {
// 这里可以配置JFinal的各种插件,比如数据库插件等 C3p0Plugin c3p0Plugin = createC3p0Plugin();
me.add(c3p0Plugin);
ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
me.add(arp);
_MappingKit.mapping(arp); } //使用JFinal内置的jetty启动项目,直接作为java application运行此文件
public static void main(String[] args) {
JFinal.start("WebRoot", 80, "/", 5);
} //通过读取外部配置文件参数创建C3P0插件
public static C3p0Plugin createC3p0Plugin(){
return new C3p0Plugin(PropKit.get("jdbcUrl"),PropKit.get("user"),PropKit.get("password").trim());
} }

另一个是大牛写的MD5加密类,加密字符串可以是用户的密码混淆其他固定字符串(盐:salt).看过《Modern PHP》中作者说,千万不能知道用户的密码,即使是网站程序被脱裤了,解密出用户的密码需要他们付出高昂的代码也不一定能解出来才是好的.并且不要使用短信息或者邮件发送用户的明文密码.

package cn.pangpython.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; public class MD5 { // 全局数组
private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; public MD5() { } // 返回形式为数字跟字符串
private static String byteToArrayString(byte bByte) {
int iRet = bByte;
// System.out.println("iRet="+iRet);
if (iRet < 0) {
iRet += 256;
}
int iD1 = iRet / 16;
int iD2 = iRet % 16;
return strDigits[iD1] + strDigits[iD2];
} // 返回形式只为数字
private static String byteToNum(byte bByte) {
int iRet = bByte;
System.out.println("iRet1=" + iRet);
if (iRet < 0) {
iRet += 256;
}
return String.valueOf(iRet);
} // 转换字节数组为16进制字串
private static String byteToString(byte[] bByte) {
StringBuffer sBuffer = new StringBuffer();
for (int i = 0; i < bByte.length; i++) {
sBuffer.append(byteToArrayString(bByte[i]));
}
return sBuffer.toString();
} public static String GetMD5Code(String strObj) {
String resultString = null;
try {
resultString = new String(strObj);
MessageDigest md = MessageDigest.getInstance("MD5");
// md.digest() 该函数返回值为存放哈希值结果的byte数组
resultString = byteToString(md.digest(strObj.getBytes()));
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
}
return resultString;
} public static void main(String[] args) {
MD5 getMD5 = new MD5();
System.out.println(getMD5.GetMD5Code("000000"));
} }

4.在注册验证器中添加确认密码的为空验证

package cn.pangpython.validate;

import com.jfinal.core.Controller;
import com.jfinal.validate.Validator; /**
* @author pangPython
* 注册的验证器
*/
public class RegistValidator extends Validator { @Override
protected void handleError(Controller arg0) { } @Override
protected void validate(Controller arg0) {
validateRequired("user.name", "nameErrMsg", "请填写用户名!");
validateRequired("user.pwd", "pwdErrMsg", "请填写密码!");
validateRequired("reg.confirm", "confirmErrMsg", "请填写确认密码!");
validateRequired("reg.yzm", "yzmErrMsg", "请填写验证码!");
} }

5.<正题….>写控制器中的注册功能的逻辑 
其中涉及到Jfinal的验证码校验、model的快速数据库操作方法

package cn.pangpython.controller;

import com.jfinal.aop.Before;
import com.jfinal.core.Controller; import cn.pangpython.model.User;
import cn.pangpython.utils.DateUtils;
import cn.pangpython.utils.MD5;
import cn.pangpython.validate.RegistValidator; /**
* @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("注册成功!");
} }

打完收工!

: )

参考原文:https://blog.csdn.net/u012995856/article/details/52863489

JFinal Web开发学习(六)验证码验证和注册细节的更多相关文章

  1. JFinal Web开发学习(七)使用layUI美化的登录功能

    效果: 验证码还是没有布局好.背景比较怀古. 1.写前端html login.jsp <!DOCTYPE html> <html> <head> <meta ...

  2. JFinal Web开发学习(五)注册界面和后端验证

    效果: 直接点击注册后 : 后端验证是可靠地,前端js验证是不可靠的.只需要在浏览器删除js验证代码即可突破js验证. 1.注册界面 在WebRoot下新建regist.jsp <%@ page ...

  3. JFinal Web开发学习(一)开启HelloWorld

    初次接触JFinal框架,接触过MVC思想,接触过Spring. JFinal官网: http://www.jfinal.com/ 之前很嫌弃JavaWeb开发,主要原因是繁琐的xml配置. 官方推荐 ...

  4. JFinal Web开发学习(三)前后台路由设计

    效果图: 一.写控制器 1.在controller包中新建AdminController后台控制器,继承Controller,实现一个index方法,作为的处理方法. /admin 后面,这个控制器中 ...

  5. JFinal Web开发学习(二)目录、架构、package设计

    package分类 config是JFinal的项目配置 controller是控制器 handler可以设置全局处理器,例如判断用户请求中是否直接请求 FreeMarker的模板文件ftl或者htm ...

  6. JFinal Web开发学习(九)后台添加前台显示博客

    效果: 发博客: 显示博客: 后台:使用hui-admin,文章编辑器是百度开源的ueditor 前台:使用layui前端框架 1.写控制器BlogController controller包中 pa ...

  7. JFinal Web开发学习(八)后台集成H-ui-admin前端框架

    h-ui-admin是一个很不错的前端框架h-ui实现的一个后台管理系统的前端. 1.在WebRoot目录下新建admin目录 2.下载h-ui-admin(当前最新是2.5版本)并解压至admin文 ...

  8. JFinal Web开发学习(四)数据库连接与自动生成model

    1.新建数据库jfinal_test,user表 /* Navicat MySQL Data Transfer Source Server : . Source Server Version : 50 ...

  9. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

随机推荐

  1. How to Pronounce Numbers 20 – 1 Billion

    How to Pronounce Numbers 20 – 1 Billion Share Tweet Share Tagged With: Numbers Numbers are something ...

  2. How to Pronounce Work vs. Walk

    How to Pronounce Work vs. Walk Share Tweet Share Tagged With: Comparison If you’re confused about th ...

  3. openwrt手工配置pptpd

    官方wiki:http://wiki.openwrt.org/doc/howto/vpn.server.pptpd#prerequisites 20190220更新:PPTP VPN协议已经被 IOS ...

  4. 使用__future__实现从python2.7到python3.x的过渡

    参考链接:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820023 ...

  5. 吴裕雄 python 爬虫(3)

    import hashlib md5 = hashlib.md5() md5.update(b'Test String') print(md5.hexdigest()) import hashlib ...

  6. 大型运输行业实战_day12_1_权限管理实现

    1.业务分析 权限说的是不同的用户对同一个系统有不同访问权限,其设计的本质是:给先给用户分配好URL,然后在访问的时候判断该用户是否有当前访问的URL. 2.实现 2.1数据库设计标准5表权限结构 2 ...

  7. 1.5.2、CDH 搭建Hadoop在安装之前(定制安装解决方案---使用内部包存储库)

    本主题描述如何在Cloudera Manager部署中创建内部包存储库和直接主机以使用该存储库.您可以创建永久或临时存储库. 完成这些步骤后,您可以安装特定版本的Cloudera Manager或在未 ...

  8. SVN Commit:将本地代码更新到服务器代码

    1.点击客户端“TortoiseSVN” 选中后显示: 点击Import: 点击“ok”:

  9. java实现person类 override(重写) comparable接口

    具体题目如下: 定义一个Person类,包含姓名(name).身高(height).体重(weight),以及talk()方法,该方法的功能是,输出自己的身高和体重信息.Person类实现Compar ...

  10. Android 性能测试之CPU

    接上一篇 CPU跟内存一样,存在一些测试子项,如下清单所示 1.空闲状态下的应用CPU消耗情况 2.中等规格状态下的应用CPU消耗情况 3.满规格状态下的应用CPU消耗情况 4.应用CPU峰值情况 C ...