您的位置:首页技术文章
文章详情页

jsp实现简单图片验证码功能

【字号: 日期:2022-06-07 17:43:02浏览:136作者:猪猪

本文实例为大家分享了jsp实现简单图片验证码的具体代码,供大家参考,具体内容如下

一、实现的功能分析

(1)在登陆页面加验证码的功能,起到一定的安全性。在输入正确的验证码,用户名和密码的情况下,才可以实现登录。
(2)实现查询数据库的功能。在登陆后的页面中,显示用户名和密码,并且设置有一个超链接,实现查询数据库的功能。
(3)代码核心是:随机生成验证码,并且显示在页面上。同时要和输入框中的输入验证码进行校验。
(4)主页面使用img标签的src属性引入验证页面的jsp文件。
(5)验证码的实现页面使用BufferedImage类的方法产生图片。
(6)使用Graphics类的各种方法实现验证码的构成。

二、代码实现

(1)登录页面:index.jsp文件。

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>登录页面</title></head><body><form action="LoginServlet" method="post">       用户名:<input name="username" type="text" value=""/><br/><br/>       密码:<input name="password" type="password" value=""/><br/><br/>                      验证码: <input type="text" name="checkCode" height="20px " value=""/>      <img src="CodeServlet"/><span>${error_code}</span><br/>       <input type="submit" value="提交"></form></body></html>

(2)登录后的页面:user.jsp文件。

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><%@  page import = "com.entity.Author"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>显示登录用户的用户名和密码页面</title></head><body><%      //内置对象    request.setCharacterEncoding("utf-8");    //获取交互层放入session中的obj    Author obj = (Author)session.getAttribute("authorInfo");        if(obj != null){        out.print("<p>用户名:"+obj.getName()+"</p>");        out.print("<p>密码:"+obj.getId()+"</p>");    }    else{        response.sendRedirect("index.jsp");    }%><br/><a href="AuthorServlet">用户信息查询 </a></body></html>

(3)实现数据查询页面:ueslist.jsp文件。

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html><html><head><meta charset="utf-8"><title>查询信息显示页面</title></head><body><table border="1">  <tr>         <td>编号</td>         <td>名称</td>         <td>价格</td>         <td>数量</td>         <td>日期</td>         <td>风格</td>  </tr>     <c:forEach items="${authorList}" var="author">  <tr>    <td>${author.id}</td>    <td>${author.name }</td>    <td>${author.price }</td>    <td>${author.num }</td>    <td>${author.dates}</td>    <td>${author.style}</td>  </tr>  </c:forEach></table></body></html>

(4)定义一个Author类,用于接收数据库中的元素。

package com.entity;//用于获取数据库中的元素对象public class Author {    private int id;    private String name;    private int price ;    private int num;    private String dates;    private String style;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getPrice() {        return price;    }    public void setPrice(int price) {        this.price = price;    }    public int getNum() {        return num;    }    public void setNum(int num) {        this.num = num;    }    public String getDates() {        return dates;    }    public void setDates(String dates) {        this.dates = dates;    }    public String getStyle() {        return style;    }    public void setStyle(String style) {        this.style = style;    }}

(5)登录页面的交互层:LoginServlet.java文件。用于登录检验和验证码匹配。

//交互层(客户端和服务器的交互)package com.servlet;import java.io.IOException;import java.sql.SQLException;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 javax.servlet.http.HttpSession;import com.dao.AuthorDao;import com.entity.Author;/** * Servlet implementation class LoginServlet */@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet {    private static final long serialVersionUID = 1L;           /**     * @see HttpServlet#HttpServlet()     */    public LoginServlet() {        super();        // TODO Auto-generated constructor stub    }    /**     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)     */    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {        // TODO Auto-generated method stub        //内置对象request,response        request.setCharacterEncoding("utf-8");                HttpSession session = request.getSession();                //获取用户输入验证码        String checkCode = request.getParameter("checkCode");        //获取session中的验证码,也就是CodeServlet中生成的四个字符        String sessionCode = (String)session.getAttribute("sCode");                        //验证码正确        if(checkCode.equals(sessionCode)) {            //获取表单数据            String username = request.getParameter("username");            int password = Integer.valueOf(request.getParameter("password"));                        //判断用户信息是否正确,查询数据库获取用户信息             AuthorDao ad = new AuthorDao();             Author obj = ad.check(username, password);                          //判断             if(obj != null) {                                  //重新放入用户信息            //     HttpSession session = request.getSession();                 session.setAttribute("authorInfo", obj);                 //设置session的有效期为10秒                 session.setMaxInactiveInterval(10);                                  //页面转发                 response.sendRedirect("user.jsp");             }             else {                                  //页面重定向到登录页面                 response.sendRedirect("index.jsp");             }        }        else {            //验证码不正确            request.setAttribute("error_code", "验证码不匹配");            request.getRequestDispatcher("index.jsp").forward(request, response);        }    }        /**     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)     */    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub        doGet(request, response);    }}

(6)数据库查询的交互层:AuthorServlet.java文件。

package com.servlet;import java.io.IOException;import java.util.List;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 com.dao.AuthorDao;import com.entity.Author;/** * Servlet implementation class AuthorServlet */@WebServlet("/AuthorServlet")public class AuthorServlet extends HttpServlet {    private static final long serialVersionUID = 1L;           /**     * @see HttpServlet#HttpServlet()     */    public AuthorServlet() {        super();        // TODO Auto-generated constructor stub    }    /**     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)     */    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub        //设置编码方式         request.setCharacterEncoding("utf-8");                  //查询用户列表         AuthorDao ad = new AuthorDao();         //将Dao层中的结果放入list中         List<Author> list = ad.queryAuthorList();         request.setAttribute("authorList", list);                  //请求转发的方式将查询结果放入request中,再将超链接直接访问AuthorServlet就将信息显示出来了。         request.getRequestDispatcher("uselist.jsp").forward(request, response);                      }    /**     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)     */    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub        doGet(request, response);    }}

(7)定义一个AuthorDao类实现查询数据库和检验登录的用户名和密码。

//用于检验登录页面所填入信息是否正确package com.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import com.entity.Author;public class AuthorDao {        public Author check(String username ,int password)    {        Author obj = null ;        try {                DBConnection db = new DBConnection();                //获取数据库连接                Connection conn = db.getConn();                //设置要执行的数据库语句                String sql = "select *from furnitures where name = ? and id = ?";                                PreparedStatement ps =  conn.prepareStatement(sql);                //设置用户名和密码放入sql语句                ps.setString(1, username);                ps.setInt(2, password);                                //执行sql查询语句 , 并将执行结果放入结果集中                ResultSet rs = ps.executeQuery();                                //用户名和密码都正确                if(rs.next()) {                                        //新创建一个obj 将查询结果放入                    obj = new Author();                    obj.setId(rs.getInt(1));                    obj.setName(rs.getString(2));                    obj.setPrice(rs.getInt(3));                    obj.setNum(rs.getInt(4));                    obj.setDates(rs.getString(5));                    obj.setStyle(rs.getString(6));                }               } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }                return obj;  }        public List<Author> queryAuthorList(){                        Author obj = null;        //定义一个list集合,用于存放查询结果        List<Author> list = new ArrayList<Author>() ;        try {                                    DBConnection db = new DBConnection();            //获取数据库连接            Connection conn = db.getConn();            //设置数据库要查询的语句            String sql = "select *from furnitures ";                        PreparedStatement ps = conn.prepareStatement(sql);                        //执行数据库查询语句,并将查询结果放入结果集            ResultSet rs = ps.executeQuery();                        //利用循环将obj放入list集合中            while(rs.next()) {                obj = new Author();                                obj.setId(rs.getInt(1));                obj.setName(rs.getNString(2));                obj.setPrice(rs.getInt(3));                obj.setNum(rs.getInt(4));                obj.setDates(rs.getString(5));                obj.setStyle(rs.getString(6));                                //将obj加入到list                                list.add(obj);                            }                                } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }                        return list;    }    }

(8)定义一个验证码生成CodeServlet类,用于生成验证码。

package com.servlet;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;@WebServlet("/CodeServlet")public class CodeServlet extends HttpServlet{        //定义验证码的源码    private static final String str ="abcdefghijklmnopqrstuvwxyaABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";        //定义随机数    private Random random = new Random();        //随机生成四个字符    public String getStr()    {        String s = "";        int len = str.length();        for(int i=0;i<4;i++) {            s+=str.charAt(random.nextInt(len));        }        return s;    }        //随机颜色    public Color getColor() {                int red = random.nextInt(256);        int green = random.nextInt(256);        int blue = random.nextInt(256);        Color color = new Color(red,green,blue);                return color;    }    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        // TODO Auto-generated method stub                        //生成验证码图片        //画板        BufferedImage image = new BufferedImage(70,20,BufferedImage.TYPE_INT_RGB );        //画笔        Graphics pen =  image.getGraphics();        //矩形        pen.fillRect(0, 0, 70, 20);        //字体        pen.setFont(new Font("微软雅黑",Font.BOLD,20));                //获取4个字符        String code = getStr();                //绘制图片        for(int i=0;i<code.length();i++) {            pen.setColor(getColor());            pen.drawString(String.valueOf(code.charAt(i)), i*15+5, 20);;        }                //response对象绘制图片到页面,Servle输出流进行图片的输出        ServletOutputStream sos = resp.getOutputStream();        ImageIO.write(image, "png", sos);                sos.flush();        sos.close();                //验证码放入session        HttpSession session = req.getSession();        session.setAttribute("sCode", code);            }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        // TODO Auto-generated method stub        doPost(req, resp);    }}

(9)创建DBConnectoin.java类用户获取数据库连接。(我用的是mysql)

//获取数据库连接package com.dao;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DBConnection {    private static String username="填入自己的数据库名";    private static String password="填入自己的数据库密码";    private static String driver = "com.mysql.jdbc.Driver";    private static String url="jdbc:mysql://localhost:3306/已经创建数据库名";        private Connection conn;        static {        try {            //加载驱动,捕获异常            Class.forName(driver);        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }        public DBConnection () throws SQLException {        //连接数据库        conn = DriverManager.getConnection(url,username,password);    }        //用于获取conn    public Connection getConn() {        return conn;    }    public void setConn(Connection conn) {        this.conn = conn;    }     }

三、页面

(1)登录页面

(2)数据查询页面

(3)查询结果显示页面

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

标签: JSP