jsp實現(xiàn)簡單圖片驗證碼功能
本文實例為大家分享了jsp實現(xiàn)簡單圖片驗證碼的具體代碼,供大家參考,具體內(nèi)容如下
一、實現(xiàn)的功能分析
(1)在登陸頁面加驗證碼的功能,起到一定的安全性。在輸入正確的驗證碼,用戶名和密碼的情況下,才可以實現(xiàn)登錄。
(2)實現(xiàn)查詢數(shù)據(jù)庫的功能。在登陸后的頁面中,顯示用戶名和密碼,并且設(shè)置有一個超鏈接,實現(xiàn)查詢數(shù)據(jù)庫的功能。
(3)代碼核心是:隨機(jī)生成驗證碼,并且顯示在頁面上。同時要和輸入框中的輸入驗證碼進(jìn)行校驗。
(4)主頁面使用img標(biāo)簽的src屬性引入驗證頁面的jsp文件。
(5)驗證碼的實現(xiàn)頁面使用BufferedImage類的方法產(chǎn)生圖片。
(6)使用Graphics類的各種方法實現(xiàn)驗證碼的構(gòu)成。
二、代碼實現(xiàn)
(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> <% ? ? ? //內(nèi)置對象 ? ? 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)實現(xiàn)數(shù)據(jù)查詢頁面: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>數(shù)量</td> ? ? ? ? ?<td>日期</td> ? ? ? ? ?<td>風(fēng)格</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類,用于接收數(shù)據(jù)庫中的元素。
package com.entity; //用于獲取數(shù)據(jù)庫中的元素對象 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文件。用于登錄檢驗和驗證碼匹配。
//交互層(客戶端和服務(wù)器的交互) 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 ?? ??? ?//內(nèi)置對象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)) { ?? ??? ??? ?//獲取表單數(shù)據(jù) ?? ??? ??? ?String username = request.getParameter("username"); ?? ??? ??? ?int password = Integer.valueOf(request.getParameter("password")); ?? ??? ??? ? ?? ??? ??? ?//判斷用戶信息是否正確,查詢數(shù)據(jù)庫獲取用戶信息 ?? ??? ??? ? AuthorDao ad = new AuthorDao(); ?? ??? ? ? ? Author obj = ad.check(username, password); ?? ??? ? ? ?? ?? ??? ? ? ? //判斷 ?? ??? ? ? ? if(obj != null) { ?? ??? ? ? ??? ?? ?? ??? ? ? ??? ? //重新放入用戶信息 ?? ??? ? ? ?//?? ? HttpSession session = request.getSession(); ?? ??? ? ? ??? ? session.setAttribute("authorInfo", obj); ?? ??? ? ? ??? ? //設(shè)置session的有效期為10秒 ?? ??? ? ? ??? ? session.setMaxInactiveInterval(10); ?? ??? ? ? ??? ?? ?? ??? ? ? ??? ? //頁面轉(zhuǎn)發(fā) ?? ??? ? ? ??? ? 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)數(shù)據(jù)庫查詢的交互層: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 ?? ??? ?//設(shè)置編碼方式 ?? ??? ? request.setCharacterEncoding("utf-8"); ?? ??? ?? ?? ??? ? //查詢用戶列表 ?? ??? ? AuthorDao ad = new AuthorDao(); ?? ??? ? //將Dao層中的結(jié)果放入list中 ?? ??? ? List<Author> list = ad.queryAuthorList(); ?? ??? ? request.setAttribute("authorList", list); ?? ??? ?? ?? ??? ? //請求轉(zhuǎn)發(fā)的方式將查詢結(jié)果放入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類實現(xiàn)查詢數(shù)據(jù)庫和檢驗登錄的用戶名和密碼。
//用于檢驗登錄頁面所填入信息是否正確 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(); ?? ??? ??? ??? ?//獲取數(shù)據(jù)庫連接 ?? ??? ??? ??? ?Connection conn = db.getConn(); ?? ??? ??? ??? ?//設(shè)置要執(zhí)行的數(shù)據(jù)庫語句 ?? ??? ??? ??? ?String sql = "select *from furnitures where name = ? and id = ?"; ?? ??? ??? ??? ? ?? ??? ??? ??? ?PreparedStatement ps = ?conn.prepareStatement(sql); ?? ??? ??? ??? ?//設(shè)置用戶名和密碼放入sql語句 ?? ??? ??? ??? ?ps.setString(1, username); ?? ??? ??? ??? ?ps.setInt(2, password); ?? ??? ??? ??? ? ?? ??? ??? ??? ?//執(zhí)行sql查詢語句 , 并將執(zhí)行結(jié)果放入結(jié)果集中 ?? ??? ??? ? ? ?ResultSet rs = ps.executeQuery(); ?? ??? ??? ??? ? ?? ??? ??? ? ? ?//用戶名和密碼都正確 ?? ??? ??? ? ? ?if(rs.next()) { ?? ??? ??? ? ? ??? ? ?? ??? ??? ? ? ??? ?//新創(chuàng)建一個obj 將查詢結(jié)果放入 ?? ??? ??? ? ? ??? ?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集合,用于存放查詢結(jié)果 ?? ??? ?List<Author> list = new ArrayList<Author>() ; ?? ??? ?try { ?? ??? ??? ? ?? ??? ??? ? ?? ??? ??? ?DBConnection db = new DBConnection(); ?? ??? ??? ?//獲取數(shù)據(jù)庫連接 ?? ??? ??? ?Connection conn = db.getConn(); ?? ??? ??? ?//設(shè)置數(shù)據(jù)庫要查詢的語句 ?? ??? ??? ?String sql = "select *from furnitures "; ?? ??? ??? ? ?? ??? ??? ?PreparedStatement ps = conn.prepareStatement(sql); ?? ??? ??? ? ?? ??? ??? ?//執(zhí)行數(shù)據(jù)庫查詢語句,并將查詢結(jié)果放入結(jié)果集 ?? ??? ??? ?ResultSet rs = ps.executeQuery(); ?? ??? ??? ? ?? ??? ??? ?//利用循環(huán)將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"; ?? ? ?? ?//定義隨機(jī)數(shù) ?? ?private Random random = new Random(); ?? ? ?? ?//隨機(jī)生成四個字符 ?? ?public String getStr() ?? ?{ ?? ??? ?String s = ""; ?? ??? ?int len = str.length(); ?? ??? ?for(int i=0;i<4;i++) { ?? ??? ??? ?s+=str.charAt(random.nextInt(len)); ?? ??? ?} ?? ??? ?return s; ?? ?} ?? ? ?? ?//隨機(jī)顏色 ?? ?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輸出流進(jìn)行圖片的輸出 ?? ??? ?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)創(chuàng)建DBConnectoin.java類用戶獲取數(shù)據(jù)庫連接。(我用的是mysql)
//獲取數(shù)據(jù)庫連接 package com.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConnection { ?? ?private static String username="填入自己的數(shù)據(jù)庫名"; ?? ?private static String password="填入自己的數(shù)據(jù)庫密碼"; ?? ?private static String driver = "com.mysql.jdbc.Driver"; ?? ?private static String url="jdbc:mysql://localhost:3306/已經(jīng)創(chuàng)建數(shù)據(jù)庫名"; ?? ? ?? ?private Connection conn; ?? ? ?? ?static { ?? ??? ?try { ?? ??? ??? ?//加載驅(qū)動,捕獲異常 ?? ??? ??? ?Class.forName(driver); ?? ??? ?} catch (ClassNotFoundException e) { ?? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ?} ?? ? ?? ?public DBConnection () throws SQLException { ?? ??? ?//連接數(shù)據(jù)庫 ?? ??? ?conn = DriverManager.getConnection(url,username,password); ?? ?} ?? ? ?? ?//用于獲取conn ?? ?public Connection getConn() { ?? ??? ?return conn; ?? ?} ?? ?public void setConn(Connection conn) { ?? ??? ?this.conn = conn; ?? ?}? ?? ? }
三、頁面
(1)登錄頁面
(2)數(shù)據(jù)查詢頁面
(3)查詢結(jié)果顯示頁面
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談request.getinputstream只能讀取一次的問題
下面小編就為大家?guī)硪黄獪\談request.getinputstream只能讀取一次的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03淺談SpringMVC jsp前臺獲取參數(shù)的方式 EL表達(dá)式
下面小編就為大家分享一篇淺談SpringMVC jsp前臺獲取參數(shù)的方式 EL表達(dá)式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03淺談JSP serverlet的區(qū)別與聯(lián)系
下面小編就為大家?guī)硪黄獪\談JSP serverlet的區(qū)別與聯(lián)系。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01使用maven+eclipse搭建struts2開發(fā)環(huán)境
Struts 2是Apache基金會的明星級產(chǎn)品,提供了對MVC的一個清晰的實現(xiàn),下面就為大家介紹一下使用maven+eclipse搭建struts2開發(fā)環(huán)境的方法2014-01-01