首頁 > 軟體

jsp實現簡單圖片驗證碼功能

2022-02-09 13:01:47

本文範例為大家分享了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)查詢結果顯示頁面

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com