Content

jsp实现简单图片验证码功能(jsp加入图片的代码)太疯狂了

文章摘要

本文实例讲述了如何在JSP中实现简单图片验证码的功能,主要分为以下几个方面: 1. **验证码生成**:使用Java Swing在`CodeServlet`类中生成随机字符和颜色,并将生成的验证码存入会话属性中,由图片验证码页面(`index.jsp`)显示。 2. **登录功能**:在登录页面(`user.jsp`)中通过图片验证码验证用户输入的用户名和密码,确保登录的安全性。 3. **数据查询**:实现数据库查询功能,返回用户信息并显示在页面上,具体实现于查询信息显示页面(`ueslist.jsp`)。 4. **数据库操作**:定义了`AuthorDao`类,用于登录验证和数据查询,通过 JDBC连接到数据库获取用户信息。 5. **交互层**:登录页面(`LoginServlet`)和查询页面(`AuthorServlet`)负责处理客户端和服务器端的交互,包括验证码验证、数据库连接和数据查询等操作。 6. **实现细节**:使用`ImageIO`和`BufferedImage`在`CodeServlet`中生成验证码图片,确保验证码的有效性和安全性。 文章通过这些技术实现,展示了如何在JSP中结合动态图片验证码和数据库查询功能,提升系统安全性。



本文实例为大家分享了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=”https://www.jb51.net/article/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=”https://www.jb51.net/article/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; @WebServlet(“/LoginServlet”) public class LoginServlet extends HttpServlet { ?private static final long serialVersionUID=1L; ? ? ? ? ? ? ? ? public LoginServlet() { ? ? ? ? super(); ? ? ? ? // TODO Auto-generated constructor stub ? ? } ? ?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); ? ?} ?} ? ? ?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; @WebServlet(“/AuthorServlet”) public class AuthorServlet extends HttpServlet { ?private static final long serialVersionUID=1L; ? ? ? ? ? ? ? ? public AuthorServlet() { ? ? ? ? super(); ? ? ? ? // TODO Auto-generated constructor stub ? ? } ? ?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); ? ? ?} ? ?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页面中动态生成图片验证码的方法实例JSP开发之生成图片验证码技术的详解JSP实用教程之简易图片验证码的实现方法(附源码)