JSP007:用jsp做一个服务器端验证码

本文详细介绍了如何使用Java生成带有随机字母和数字的验证码图片,并实现客户端与服务器端的验证码对比验证过程。通过随机倾斜字符、改变字体颜色及添加下划线等技巧,增强验证码的复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 首先,验证码需要一个背景图,背景图上面有随机的数字或者是字母组成。所以先在服务端给客户端发送一个背景图,然后使用画笔添加字符。字符随意倾斜(随机数做),字体颜色随意(三原色0-255随机数做)。下划线(位置随机数)

<%@page import="java.awt.Color"%>
<%@page import="java.awt.Font"%>
<%@page import="java.awt.Graphics"%>
<%@page import="com.sun.image.codec.jpeg.JPEGImageEncoder"%>
<%@page import="com.sun.image.codec.jpeg.JPEGCodec"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="javax.swing.text.AbstractDocument.Content"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE >
<html>
  <head>
  </head>
  <body>
     <%
     //设置格式
     response.setContentType("image/jpeg");
     //关out内置对象
     out.clear();
     out=pageContext.pushBody();
     //创建一张图,这个图在内存里面
     BufferedImage image=new BufferedImage(100,40,BufferedImage.TYPE_INT_RGB);
     //画笔工具
      Graphics g=image.getGraphics();
      //把字符串转化成字符串数组
      char[] b="QWERTYUIOPLKJHGFDSAZXCVBNMqwertyuioplkjhgfdsazxcvbnm0123456789".toCharArray();
      g.setFont(new Font("宋体",Font.BOLD,30));//设置子样式
      //这里是使用颜色填充背景,显示画笔变色,在让画笔完全填充背景
      g.setColor(Color.orange);
      g.fillRect(0, 0, image.getWidth(), image.getHeight());
      StringBuilder sb=new StringBuilder("");
      for(int i=1;i<=4;i++){
       int shu= (int)(Math.random()*b.length);
       //颜色
            	int aa=(int)(Math.random()*256);
    			int bb=(int)(Math.random()*256);
    			int cc=(int)(Math.random()*256);  
    			    int dd=(int)(Math.random()*22);
    			int xx=(int)(Math.random()*100);
    			int yy=(int)(Math.random()*40);			
    			g.setColor(new Color(aa,bb,cc));
    			sb.append(b[shu]);
    			
    			session.setAttribute("sb", sb);
    			
    			g.drawString(b[shu]+"", 18*i, 23);
    			g.drawLine(yy, xx, xx, yy);
      }     
     ServletOutputStream sos=response.getOutputStream();
     //过滤流包装搜索,获取更强大的api
    JPEGImageEncoder en= JPEGCodec.createJPEGEncoder(sos);
    en.encode(image);   
    %>
  </body>
</html>

  • 做一个客户端测试,点击图片换一张二维码,(局部刷新)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>


<!DOCTYPE>
<html>
  <head>
 
  </head>
  
  <body>
   <form action="dafen.jsp">
         用户名:<input><br>
         密码:<input><br>
       验证码:<input name="yzm"> <img onclick="f1(this)" src="index.jsp" /><br>
    		<input type="submit">
   </form>
   <script type="text/javascript">
    		function f1(img){
    			img.src="index.jsp?="+new Date().getTime();
    		}
  </body>
</html>

  • 提交之后二维码数据对比,对比之后做出相应判断,一样则入库,不一样则返回重新注册
 <h1>提交成功</h1>
  <%
    		String str=request.getParameter("yzm");
    		Object obj=session.getAttribute("sb");
    		if(obj!=null){
    		
    		String sb=((StringBuilder)obj).toString();
    		if(str.toLowerCase().equals(sb.toLowerCase())){
    			//注册入库
    			out.print("true");
    			session.removeAttribute("sb");
    		}else{
    			//在回到注册页面
    			out.print("回去");
    		}
    		}else{
    			out.print("回去");
    		}
    		
    	 %>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值