绘制图片并验证验证码输入是否有误

//1.绘制验证图片
package cn.ytu.checkCode;

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

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//产生验证图片
public class CheckImage extends HttpServlet {

	//设置全局变量,代表图形的长和宽
	public static final int WIDTH = 120;
	public static final int HEIGHT = 30;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 在内存中构建一幅图形
		BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
				BufferedImage.TYPE_INT_RGB);
		Graphics g = image.getGraphics();

		// 1.设置图形的背景色

		setBackground(g);

		// 2.设置边框

		setBorder(g);

		// 3.写随机数

		String token=drawRandomNum((Graphics2D)g);
		//并把往图形上写的数字存到Session域中,并带给服务器
		request.getSession().setAttribute("token", token);

		// 4.画干扰线

		drawRandomLine(g);

		// 5.将图形写给浏览器
		response.setContentType("image/jpeg");
		//控制浏览器不要缓存
		response.setDateHeader("expries", -1);
		response.setHeader("Cache-Control", "no-cache");
		response.setHeader("Pragma", "no-cache");
		
		ImageIO.write(image, "jpg", response.getOutputStream());

	}

	private void setBackground(Graphics g) {

		g.setColor(Color.WHITE);
		g.fillRect(0, 0, WIDTH, HEIGHT);//填充矩形
		
	}
	
	private void setBorder(Graphics g) {
		g.setColor(Color.BLUE);
		g.drawRect(1, 1, WIDTH-2, HEIGHT-2);

	}

	private void drawRandomLine(Graphics g) {
		g.setColor(Color.BLACK);
		
		for(int i=0;i<4;i++){
			int x1= new Random().nextInt(WIDTH);
			int y1= new Random().nextInt(HEIGHT);
			int x2= new Random().nextInt(WIDTH);
			int y2= new Random().nextInt(HEIGHT);
			g.drawLine(x1, y1, x2, y2);
		}
	}

	//得到往图片上写的数据
	private String drawRandomNum(Graphics2D g) {
		g.setColor(Color.GREEN);
		g.setFont(new Font("宋体", Font.ITALIC,20 ));
		StringBuffer sb=new StringBuffer();
		int x=10;
		String base="1234567890";
		for(int i=0;i<4;i++){
			int degree=new Random().nextInt()%60; //得到一个-60~60的随机数
			char c=base.charAt(new Random().nextInt(base.length()));
			sb.append(c);
			g.rotate(degree*Math.PI/180, x, 20);  //设置旋转
			g.drawString(c+"", x, 20);
			g.rotate(-degree*Math.PI/180,x,20);   //取消当前旋转角度
			x=x+30;
		}
		return sb.toString();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

//2.验证验证码输入是否有误
package cn.ytu.checkCode;

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

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

//验证输入码是否正确
public class RegestServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out=response.getWriter();
		
		String sever_token=(String) request.getSession().getAttribute("token");   //获取服务器端存储的验证码
		String client_token=request.getParameter("token");   // 获取客户端(用户输入的验证码)
		if(sever_token!=null && client_token!=null && sever_token.endsWith(client_token)){
			out.write("注册成功");
			return;
		}else{//验证码验证失败,重新跳转到当前页
			response.sendRedirect("/day06/login.jsp");
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}
}

//3.表单页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>
  <head>
   
    <title>登陆</title>
    
    <script type="text/javascript">
    <%--点击换幅图片    --%>
       function changeImage(img)  
       {
          img.src=img.src+"?"+ new Date().getTime();
       }
    </script>
  </head>
  
  <body>
  <form action="/day06/servlet/RegestServlet" method="post">
    用户名:<input type="text" name="username"/><br>
    密码:<input type="password" name="password"><br/>
    验证码:<input type="text" name="token"> <img  src="/day06/servlet/CheckImage" οnclick="changeImage(this)"><br/>
    <input type="submit" value="注册">
    </form>
  </body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值