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

文件结构

在这里插入图片描述

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 < params.length; 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 <T> 实体类类型泛型
     * @return 就是我们查询到的数据集合
     */
    public static <T> T executeDQLGetOne(String sql, Class<T> cls , Object... params){

        List<T> 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 <T> 实体类类型泛型
     * @return 就是我们查询到的数据集合
     */
    public static <T> List<T> executeDQL(String sql, Class<T> cls , Object... params) {


        try {
            Connection connection = getConnection(); //获取连接

            //获取预处理sql
            PreparedStatement preparedStatement = connection.prepareStatement(sql);

            //设置参数
            if(null != params){

                for(int i = 0 ; i < params.length ; i++){
                    preparedStatement.setObject(i+1,params[i]);
                }

            }

            //执行查询 得到结果集
            ResultSet resultSet = preparedStatement.executeQuery();

            //获取元数据(我们的列名)
            ResultSetMetaData metaData = resultSet.getMetaData();
            //列的总数
            int columnCount = metaData.getColumnCount();

            //用来保存我们所有的表数据
            List<T> list = new ArrayList<T>();
            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("<html>");
            out.println("<head>");
            out.println("<title> 登录结果 </title>");
            out.println("<body>");
            out.println("you not login <a href='/index.jsp'>跳转到登录页面</a>");
            out.println("</body>");
            out.println("</head>");
            out.println("</html>");
        }else{
            List<User> allUser = userService.findAllUser();

            //查询到我们所有的用户信息
            out.println("<html>");
            out.println("<head>");
            out.println("<title> 登录结果 </title>");
            out.println("<body>");

            //遍历所有用户信息并且打印
            for(User ui : allUser){
                out.println(ui);
                out.println("<hr>");
            }

            out.println("</body>");
            out.println("</head>");
            out.println("</html>");
        }

    }
}

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("<html>");
        out.println("<head>");
        out.println("<title> 登录结果 </title>");
        out.println("<body><h1>");
        out.println(msg);
        out.println(msg1);
        out.println("</h1></body>");
        out.println("</head>");
        out.println("</html>");
    }
}

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<User> 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" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="demo/login" method="post">
    <label>姓名:</label><input type="text" name="name"><br/>
    <label>密码:</label><input type="password"  name="pass"><br/>
        <label>验证码:</label> <img src="demo/createCode" /> <input type="text" name="vcode"><br/>
    <input type="submit" value="提交">
  </form>
  </body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值