热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Web登录小案例(含验证码登录)

文件结构druidpool.propertiesdriverClassNamecom.mysql.cj.jdbc.Driverurljdbc:mysql:localhost:330




文件结构

在这里插入图片描述


druidpool.properties

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest?serverTimezOne=UTC&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
# 初始化连接数量
initialSize=10
# 最大的连接数量
maxActive=200

DBUtil.java

public class DBUtil {
//通过连接池获取数据
static DruidDataSource dataSource;
static {
//加载配置文件
Properties properties = new Properties();
InputStream resourceAsStream = DBUtil.class.getClassLoader().getResourceAsStream("druidpool.properties");
try {
properties.load(resourceAsStream);
//根据配置文件获取一个数据源
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接
* @return
*/
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
public static boolean executeDML(String sql,Object... params){
// 获取连接
Connection cOnnection= getConnection();
try {
//获取预处理的对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//设置参数
if (null != params){
for (int i = 0; i preparedStatement.setObject(i+1,params[i]);
}
int i = preparedStatement.executeUpdate();
return i > 0;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return false;
}
/**
* 通用的查询;查询一个
* @param sql 查询语句
* @param cls 实体类的字节码对象
* @param params 查询语句里面的占位符
* @param 实体类类型泛型
* @return 就是我们查询到的数据集合
*/
public static T executeDQLGetOne(String sql, Class cls , Object... params){
List ts = executeDQL(sql, cls, params);
if(null != ts && ts.size() > 0){
return ts.get(0);//直接获取第一个结果
}
return null;
}
/**
* 通用的查询;需要将我们的数据表信息,封装到List里面进行返回
* @param sql 查询语句
* @param cls 实体类的字节码对象
* @param params 查询语句里面的占位符
* @param 实体类类型泛型
* @return 就是我们查询到的数据集合
*/
public static List executeDQL(String sql, Class cls , Object... params) {
try {
Connection cOnnection= getConnection(); //获取连接
//获取预处理sql
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//设置参数
if(null != params){
for(int i = 0 ; i preparedStatement.setObject(i+1,params[i]);
}
}
//执行查询 得到结果集
ResultSet resultSet = preparedStatement.executeQuery();
//获取元数据(我们的列名)
ResultSetMetaData metaData = resultSet.getMetaData();
//列的总数
int columnCount = metaData.getColumnCount();
//用来保存我们所有的表数据
List list = new ArrayList();
T t;//用来保存我们一条数据
//遍历结果集
while(resultSet.next()){ //每一行记录的遍历过程中
t = cls.newInstance();//根据字节码文件,构建一个实体类的对象
//获取所有列的数据
for(int i = 1 ; i <= columnCount ; i++){
//你的查询语句有时候有别名
String columnLabel = metaData.getColumnLabel(i);
//根据列名获取我们的记录
Object object = resultSet.getObject(columnLabel);
//需要将拿到的这一列的记录,放到t对象指定的属性里面;
//需要拿到这个t对象的属性,然后赋值;
//解决方案2: 如果Object是NULL没有必要设置了
if(null != object){
try {
Field field = cls.getDeclaredField(columnLabel);//根据属性的名称通过反射获取他的属性对象
field.setAccessible(true);
field.set(t,object);
} catch (NoSuchFieldException e) {
//代表我们当前这个实体类里面,没有这个属性
}
}
}
//需要将t对象保存到list
list.add(t);
}
return list;
} catch (SQLException sqlException) {
sqlException.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return null;
}
}

CodeServlet(验证码)

package com.biao.web.Servlet;
import cn.dsna.util.images.ValidateCode;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo/createCode")
public class CodeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个验证码;验证码的宽高;数字的个数;干扰线
ValidateCode vc = new ValidateCode(180,40,6,55);
//禁止图像缓存
resp.setHeader("Pragma","no-cache");
resp.setHeader("Cache-Control","no-cache");
resp.setDateHeader("Expires",0);
//获取验证码的值
String code = vc.getCode();
req.getSession().setAttribute("code",code);
System.out.println(code);
//将图片验证码输出到前台页面
vc.write(resp.getOutputStream());
}
}

LoginServlet


@WebServlet("/demo/login")
public class LoginServlet extends HttpServlet {
LoginService loginService = new LoginService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求的编码格式
req.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
String pass = req.getParameter("pass");
//获得前台传来的验证码
String vcode = req.getParameter("vcode");
//sehngcheng de获得Session的验证码
String code = String.valueOf(req.getSession().getAttribute("code"));
//执行登录的业务
int result = loginService.login(name, pass);
resp.setHeader("Content-type","text/html;charset=UTF-8");
resp.setCharacterEncoding("utf-8");
String msg = "";
if (code.equals(vcode)) {
if (result == SystemCode.USER_LOGIN_SUCCESS) {
msg = "恭喜你登录成功";
//如果用户登录成功,就把用户的姓名保存到会话里面;
//只要这个会话里面有这个用户的姓名;代表这个用户登录成功
req.getSession().setAttribute("name", name);
} else if (result == SystemCode.USER_LOGIN_PASS_WORNG) {
msg = "密码错误";
} else {
msg = "没有这个用户";
}
}else{
msg = "验证码错误";
}
req.setAttribute("msg",msg);
//跳到查询用户数据页面
//req.getRequestDispatcher("/demo/userList").forward(req,resp);
//展示结果
req.getRequestDispatcher("/demo/view").forward(req,resp);
}
}

UserServlet


@WebServlet("/demo/userList")
public class UserServlet extends HttpServlet {
UserService userService = new UserService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
//如果登录就获取登录的用户名
Object name = req.getSession().getAttribute("name");
if (name == null){
//说明没有登陆成功
out.println("");
out.println("");
out.println("");
out.println("");
out.println("you not login 跳转到登录页面");
out.println("");
out.println("");
out.println("");
}else{
List allUser = userService.findAllUser();
//查询到我们所有的用户信息
out.println("");
out.println("");
out.println("");
out.println("");
//遍历所有用户信息并且打印
for(User ui : allUser){
out.println(ui);
out.println("


");
}
out.println("");
out.println("");
out.println("");
}
}
}

View

@WebServlet("/demo/view")
public class View extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("这个是别的地方跳转过来的");
//只负责视图的展示;不负责业务处理
PrintWriter out = response.getWriter();
//从request对象里面;获取一个值
Object msg = request.getAttribute("msg");
Object msg1 = request.getSession().getAttribute("msg");
out.println("");
out.println("");
out.println("");
out.println("");
out.println(msg);
out.println(msg1);
out.println("");
out.println("");
out.println("");
}
}

LoginService

public class LoginService {
LoginDao loginDao = new LoginDao();
/**
* 登录
* @param name
* @param pass
* @return
*/
public int login(String name, String pass) {
return loginDao.Login(name,pass);
}
}

UserService

public class UserService {
UserDao userDao = new UserDao();
public List findAllUser(){
return userDao.findAllUser();
};
}

User

public class User {
private int uid;
private String uname;
private String upass;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
@Override
public String toString() {
return
"uid=" + uid +
", uname='" + uname + '\'' +
", upass='" + upass + '\''
;
}
}

LoginDao

public class LoginDao {
/**
* 从数据库中去查找数据
* @param name
* @param pass
* @return
*/
public int Login(String name,String pass){
//需要去连接数据库查询这个用户是否存在;
String sql = "select * from userinfo where uname = ?";
//去数据库查询我们的用户信息
User user = DBUtil.executeDQLGetOne(sql, User.class,name);
if (user == null){
//代表用户不存在
return SystemCode.USER_LOGIN_USER_NULL;
}
//如果密码一致,代表登录成功
if (pass.equals(user.getUpass())){
return SystemCode.USER_LOGIN_SUCCESS;
}
return SystemCode.USER_LOGIN_PASS_WORNG;
}
}

UserDao

public class LoginDao {
/**
* 从数据库中去查找数据
* @param name
* @param pass
* @return
*/
public int Login(String name,String pass){
//需要去连接数据库查询这个用户是否存在;
String sql = "select * from userinfo where uname = ?";
//去数据库查询我们的用户信息
User user = DBUtil.executeDQLGetOne(sql, User.class,name);
if (user == null){
//代表用户不存在
return SystemCode.USER_LOGIN_USER_NULL;
}
//如果密码一致,代表登录成功
if (pass.equals(user.getUpass())){
return SystemCode.USER_LOGIN_SUCCESS;
}
return SystemCode.USER_LOGIN_PASS_WORNG;
}
}

SystemCode

public interface SystemCode {
int USER_LOGIN_SUCCESS = 90000; //编号代表登录成功
int USER_LOGIN_PASS_WORNG= 90001; //代表密码错误
int USER_LOGIN_USER_NULL= 90002; //代表用户不存在
}

index.jsp(验证码也需要在这里传入)

<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>


















推荐阅读
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
author-avatar
mobiledu2502878013
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有