登录验证码由servlet实现

简单的登录验证码由servlet实现

  1. 创建包util,类ImageServlet
    在这里插入图片描述
package util;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class ImageServlet extends HttpServlet {
    public ImageServlet() {
        super();
    }

    @Override
    public void destroy() {
        super.destroy();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        int width=78;
        int height=20;
        //创建对象
        BufferedImage bim=new BufferedImage(68,20,BufferedImage.TYPE_INT_RGB);
        /*
        获取图片对象bim的图形上下文对象g,这个g的功能如同一支绘图笔,程序中使用这支笔来绘制、修改图片对象bim
        */
        Graphics g=bim.getGraphics();
        Random rm=new Random();
        g.setColor(new Color(rm.nextInt(100),205,rm.nextInt(100)));
        g.fillRect(0,0,width,height);
        StringBuffer sbf=new StringBuffer();
        //输出数字
        for(int i=0;i<4;i++){
            g.setColor(Color.black);
            g.setFont(new Font("微软雅黑",Font.BOLD|Font.ITALIC,22));
            int n=rm.nextInt(10);
            sbf.append(n);
            g.drawString(""+n,i*15+5,18);
        }
        //生成的验证码保存到session中
        HttpSession sn=req.getSession();
        sn.setAttribute("piccode",sbf);
        //禁止缓存
        resp.addHeader("Prama","no-cache");
        resp.setHeader("Coche-Control","no-cache");
        resp.setDateHeader("Expires",0);
        resp.setContentType("image/jpeg");
        //将bim图片以"jpg"格式返回给浏览器
        ImageIO.write(bim,"JPG",resp.getOutputStream());
        resp.getOutputStream().close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    @Override
    public void init() throws ServletException {
        super.init();
    }
}

2.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>ImageServlet</servlet-name>
        <servlet-class>util.ImageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ImageServlet</servlet-name>
        <url-pattern>/ImageServlet</url-pattern>
    </servlet-mapping>
</web-app>

3.创建登录界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
    <script>
        function reloadImage(t) {
              t.src="ImageServlet?flag="+Math.random();
        }
    </script>
</head>
<body>
    <div align="center">
    <form action="checkUser.jsp" method="post">
        <table bgcolor="#e7daff">
            <tr><td colspan="2" align="center">用户登录</td></tr>
            <tr><td>用户名:</td>
                <td><input type="text" name="user"></td>
            </tr>
            <tr><td>密码:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr><td>验证码</td>
                <td><input type="text" name="checkcode">
                    <img src="ImageServlet" align="middle" alt="看不清,点击这里!" onclick="reloadImage(this)"></td>
            </tr>
            <tr><td colspan="2" align="center"><input type="submit" value="登录"></td></tr>
        </table>
    </form>
    </div>
</body>
</html>

4.创建javabean,里面java代码用来连接数据库,与jsp部分相分离来

package bean;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBcon {
    private String str="com.mysql.cj.jdbc.Driver";
    private String root="root";
    private String password="2001223";
    private String url="jdbc:mysql://localhost:3306/users";
    public Connection getconnection() throws ClassNotFoundException, SQLException {
        Class.forName(str);
        return DriverManager.getConnection(url,root,password);
    }
}

5.创建登录验证的jsp文件

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="db" class="bean.DBcon" scope="request"></jsp:useBean>
<html>
<head>
    <title>登录验证</title>
</head>
<body>
    <%
        request.setCharacterEncoding("utf-8");
        String username=request.getParameter("user");
        String password=request.getParameter("password");
        String checkcode=request.getParameter("checkcode");
        String piccode=request.getSession().getAttribute("piccode").toString();
    %>
            你输入的验证码是:<%=checkcode%><br>
            由servlet生成的验证码是:<%=piccode%><br>
            你输入的用户名是:<%=username%><br>
            你输入的密码是:<%=password%><br><hr>
    <%
        Connection con=db.getconnection();
        Statement stmt=con.createStatement();
        String sql="select * from userinfo";
        sql+=" where loginname='"+username+"' and password='"+password+"'";
        ResultSet rs=stmt.executeQuery(sql);
        if(checkcode.equals(piccode)&&rs.next()){
            session.setAttribute("userName",username);
            out.print("<span style='color:green'>恭喜你,验证通过!</span><br><br>");
            out.print("<a href='main.jsp'>转向主页面</a>");
        }else {
            out.print("<span style='color:red'>验证错误或无此用户或密码错误,登录失败!</span><br>");
            out.print("<a href='login.jsp'>重新登录</a>");
        }
    %>
</body>
</html>

6.运行效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙行者ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值