使用Servlet实现验证码

使用Servlet实现验证码制作主要思路
     <img alt="验证码" src="<%=request.getContextPath()%>/servlet/ImageServlet" />
     运用Servlet随机生成图片,用到的类:
	1.      BufferedImage图像数据缓冲区
	2.      Graphics绘制图片
	3.      Color获取颜色
	4.      Random生成随机数
	5.      ImageIO输出图片
     ImageServlet类
	1.      定义BufferedImage对象
	2.      获取Graphics对象
	3.      Random随机生成验证码信息
	4.      使用Graphics绘制图片
	5.      验证码信息放入StringBuffer缓冲区,再传入Session中
	6.      使用ImageIO输出图片
     校验验证码是否正确
     CheckServlet类
	1.      获取页面提交的验证码
	2.      获取Session中的验证码
	3.      信息校验
	4.      返回结果
(ps:我用的是Eclipse与Myeclipse有点不同  但是代码都是一样的,一下是我的代码块图片展示)

实验要达到的效果如下:

接下来是代码展示
1.ImageServlet.java
package com.check;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImageServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
		//图像数据缓冲区
		BufferedImage bi = new BufferedImage(68,22,BufferedImage.TYPE_INT_RGB);
		//绘制图片
		Graphics g = bi.getGraphics();
		//获取颜色
		Color c = new Color(200,150,255);
		g.setColor(c);
		g.fillRect(0, 0, 68, 22);
		
		char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
		//生成随机数
		Random r = new Random();
		int len=ch.length,index;
		StringBuffer sb = new StringBuffer();
		for(int i=0; i<4; i++){
			index = r.nextInt(len);
			g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));
			g.drawString(ch[index]+"", (i*15)+3, 18);
			sb.append(ch[index]);
		}
		request.getSession().setAttribute("piccode", sb.toString());
		//输出图片
		ImageIO.write(bi, "JPG", response.getOutputStream());
	}
}
2.LoginServlet.java
package com.check;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
		
		String piccode = (String) request.getSession().getAttribute("piccode");
		String checkcode = request.getParameter("checkcode");
		//输入验证码不需要区分大小写
		checkcode = checkcode.toUpperCase();
		//纠正显示在网页上的乱码
		response.setContentType("text/html;charset=gbk");
		PrintWriter out = response.getWriter();
		if(checkcode.equals(piccode)){
			out.println("验证码输入正确!");
		}else{
			out.println("验证码输入错误!!!");
		}
		out.flush();
		out.close();
		
	}
}
3.web.xml
 <servlet>
      <servlet-name>ImageServlet</servlet-name>
      <servlet-class>com.check.ImageServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>ImageServlet</servlet-name>
      <url-pattern>/servlet/ImageServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
      <servlet-name>LoginServlet</servlet-name>
      <servlet-class>com.check.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>LoginServlet</servlet-name>
      <url-pattern>/servlet/LoginServlet</url-pattern>
  </servlet-mapping>
  
4.index.jsp
<script type="text/javascript">
	//这段代码主要是实现点击看不清楚就可以刷新验证码
		function reloadCode(){
			var time = new Date().getTime();
			document.getElementById("imagecode").src="<%=request.getContextPath() %>/servlet/ImageServlet?d="+time;
		}
	</script>
  </head>
  
  <body>
  <form action="<%=request.getContextPath() %>/servlet/LoginServlet" method="post">
    验证码:<input type="text" name="checkcode"/>
    <img alt="验证码" id="imagecode" src="<%=request.getContextPath() %>/servlet/ImageServlet"/>
    <a href="javascript: reloadCode();">看不清楚</a><br>
    <input type="submit" value="提交">
    </form>
  </body>
以上就是servlet制作验证码的基本流程,有兴趣的小伙伴们可以在我的网盘下载更多的其他验证方式,比如:算术验证,中文验证等
链接:https://pan.baidu.com/s/1hrFpqTm 密码:a1g6




  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现验证码功能的主要思路是在用户注册或登录时生成一个随机的验证码图片,并将验证码保存在session中。当用户提交表单时,将用户输入的验证码与session中保存的验证码进行比对,如果一致则继续执行,否则提示用户输入错误。 以下是一个使用IDEA和Servlet实现验证码功能的示例代码。 1. 首先,在web.xml中配置servletservlet-mapping: ```xml <servlet> <servlet-name>VerifyCodeServlet</servlet-name> <servlet-class>com.example.VerifyCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>VerifyCodeServlet</servlet-name> <url-pattern>/verifyCode</url-pattern> </servlet-mapping> ``` 2. 创建一个名为VerifyCodeServletservlet类,实现doGet方法: ```java package com.example; import javax.imageio.ImageIO; 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 java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; @WebServlet("/verifyCode") public class VerifyCodeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int width = 100; int height = 30; //创建一个图像缓冲区 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //获取Graphics2D Graphics2D g2 = (Graphics2D) image.getGraphics(); //设置背景色 g2.setColor(Color.WHITE); g2.fillRect(0, 0, width, height); //设置字体 g2.setFont(new Font("宋体", Font.BOLD, 20)); //生成随机字符 String verifyCode = generateVerifyCode(); //将验证码保存在session中 HttpSession session = request.getSession(); session.setAttribute("verifyCode", verifyCode); //绘制验证码 Random random = new Random(); for (int i = 0; i < verifyCode.length(); i++) { g2.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); g2.drawString(String.valueOf(verifyCode.charAt(i)), i * 20 + 10, 20); } //加入干扰线 for (int i = 0; i < 5; i++) { g2.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); g2.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } //输出图像到页面 response.setContentType("image/jpeg"); ImageIO.write(image, "jpeg", response.getOutputStream()); } /** * 生成随机验证码 * * @return */ private String generateVerifyCode() { String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; StringBuilder sb = new StringBuilder(); Random random = new Random(); for (int i = 0; i < 4; i++) { sb.append(chars.charAt(random.nextInt(chars.length()))); } return sb.toString(); } } ``` 3. 在用户注册或登录页面中添加验证码图片和输入框: ```html <form action="login" method="post"> <div> <label for="username">用户名:</label> <input type="text" name="username" id="username"> </div> <div> <label for="password">密码:</label> <input type="password" name="password" id="password"> </div> <div> <label for="verifyCode">验证码:</label> <input type="text" name="verifyCode" id="verifyCode"> <img src="verifyCode" alt="验证码"> </div> <div> <input type="submit" value="登录"> </div> </form> ``` 4. 在用户登录或注册时验证验证码是否正确: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取用户输入的验证码 String verifyCode = request.getParameter("verifyCode"); //获取session中保存的验证码 HttpSession session = request.getSession(); String sessionVerifyCode = (String) session.getAttribute("verifyCode"); //比对验证码 if (verifyCode.equalsIgnoreCase(sessionVerifyCode)) { //验证码正确,继续执行 } else { //验证码错误,提示用户 } } ``` 以上就是用IDEA和Servlet实现验证码功能的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值