Session+mysql+MVC实现验证码登录【JAVAEE】

项目结构

采用MVC结构搭建
MVC
访问数据库检验用户名密码的Logindao
在这里插入图片描述

登录是否成功的判断条件:Session中是否含有user
sa

1.CheckCodeServlet:产生验证码图片输出,并将验证码内容存入session
2.LoginServlet:根据session和request中的数据。先判断验证码,再判断用户名是否正确。
ser

上代码

Logindao
package dao;

import entity.User;
import java.sql.*;

/**
 * 模型层,用于处理登录
 */
public class LoginDao {
    public int login(User user){//登录
        //返回:          -1  系统异常   0:用户不存在   1:登陆成功
        int result=-1;
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "105105");
            String sql="select  id,username,password from t_user where username= ? and password = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,user.getUsername());
            ps.setString(2,user.getPassword());
            rs = ps.executeQuery();
            if (rs.next()){
                result = rs.getInt(1);
            }
            if (result>0){
                return 1;//登录成功
            }else {
                return 0;//用户不存在
            }

        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        } finally {
            if (rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }if (ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }if (conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }


        }

    }
}

user对象
package entity;

public class User {
    private int id;
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

CheckCodeServlet
package servlet;

import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet("/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int width=100;
        int heigth=50;
        //1.创建验证码图片对象
        BufferedImage image=new BufferedImage(width,heigth,BufferedImage.TYPE_INT_RGB);//BufferedImage.TYPE_INT_RGB  三原色

        //2.美化图片
        //2.1 填充背景色
        Graphics g = image.getGraphics();//画笔对象
        g.setColor(Color.PINK);//设置画笔颜色
        g.fillRect(0,0,width,heigth);//填充

        //2.2画边框
        g.setColor(Color.BLUE);
        g.drawRect(0,0,width-1,heigth-4);

        StringBuilder sb=new StringBuilder();
        String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        //生成随机角标
        Random ran=new Random();
        for (int i=1;i<=4;i++){
            int index=ran.nextInt(str.length());//生成随机角标
            char ch=str.charAt(index);//获取字符
            sb.append(ch);
            //2.3 写入验证码
            g.drawString(ch+"",width/5*i,heigth/2);
        }

        String checkCode_session = sb.toString();
        //将验证码存入session
        req.getSession().setAttribute("checkCode_session",checkCode_session);


        //2.4画干扰线
        g.setColor(Color.GREEN);

        //随机生成坐标点
        for (int i=0;i<10;i++){
            int x1=ran.nextInt(width);
            int x2=ran.nextInt(width);

            int y1=ran.nextInt(width);
            int y2=ran.nextInt(width);
            g.drawLine(x1,y1,x2,y2);
        }

        //3.将图片输出到页面展示
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }
}

LoginServlet
package servlet;

import dao.LoginDao;
import entity.User;
import javax.servlet.*;
import java.io.IOException;

/**
 * 控制层
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.处理编码
        req.setCharacterEncoding("UTF-8");//对请求体中的数据采用指定方式进行编码【POST请求】
        //2.获取参数
        String username = req.getParameter("uname");
        String password = req.getParameter("upwd");
        String checkCode = req.getParameter("checkCode");

        //3.从session中获取生成的验证码
        String checkCode_session = (String) req.getSession().getAttribute("checkCode_session");
        //删除验证码(保证只能使用一次就)
        req.getSession().removeAttribute("checkCode_session");
        //3.2 判断验证码是否正确
        if (checkCode_session!=null && checkCode_session.equalsIgnoreCase(checkCode)){//忽略大小写的比较   equalsIgnoreCase
            //验证码正确
            //验证用户名和密码
            User user=new User(username,password);
            int result = new LoginDao().login(user);
            if (result>0){
                //登录成功
                //存储用户信息
                req.getSession().setAttribute("user",user);
                req.getRequestDispatcher("success.jsp").forward(req,resp);
            } else{
                //登录失败
                //存入错误信息到request
                req.setAttribute("login_error","用户名密码错误");
                req.getRequestDispatcher("login.jsp").forward(req,resp);
            }
        } else {
            //验证码不正确
            //存储错误信息到request
            req.setAttribute("cc_error","验证码错误");
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }




    }
}

前段页面
452
代码:

login.jsp
<%--
  Created by IntelliJ IDEA.
  User: Chef Liu
  Date: 2020/5/19
  Time: 18:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>登录</title>
    <script>
        window.onload=function () {
            document.getElementById("img").onclick=function () {
                this.src="CheckCodeServlet?time="+new Date().getTime();
                // 这里new Date().getTime(),的作用是避免浏览器以为是同一张图片不会刷新了
            }
        }
    </script>
    <style>
        div{
            color: red;
        }
    </style>
  </head>
  <body>
      <form action="LoginServlet" method="post">
          <table>
              <tr>
                  <td>用户名</td>
                  <td><input type="text" name="uname"></td>
              </tr>
              <tr>
                  <td>密码</td>
                  <td><input type="password" name="upwd"></td>
              </tr>
              <tr>
                  <td>验证码</td>
                  <td><input type="text" name="checkCode"></td>
              </tr>
              <tr>
                  <td colspan="2"><img id="img" src="CheckCodeServlet"></td>
              </tr>
              <tr>
                  <td colspan="2"> <input type="submit" value="login"></td>
              </tr>
          </table>

          <div><%=request.getAttribute("login_error")==null ? "" :request.getAttribute("login_error") %></div>
          <div><%=request.getAttribute("cc_error")==null ? "" :request.getAttribute("cc_error")%></div>
      </form>
  </body>
</html>

登录成功页面:显示用户名+注销按钮
<%@ page import="entity.User" %><%--
  Created by IntelliJ IDEA.
  User: Chef Liu
  Date: 2020/5/25
  Time: 14:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        User user = (User) request.getSession().getAttribute("user");
    %>
    <%
        if (user!=null){

    %>
    <h1><%=user.getUsername()%></h1>
    <%

        }
    %>

</body>
</html>
注销(使Session失效)
<%--
  Created by IntelliJ IDEA.
  User: Chef Liu
  Date: 2020/5/19
  Time: 11:34
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注销</title>
</head>
<body>
   <%
       session.invalidate();//session失效
       response.sendRedirect(request.getContextPath()+"/login.jsp");
   %>

</body>
</html>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值