servlet生成验证码图片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ScongHW/article/details/81256338

1.使用BufferedImage类来生成验证码图片

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintWriter;
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;
import javax.servlet.http.HttpSession;
/**
 *生成验证码 
 */
public class ImageServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		int width = 200;
		int height = 35;
		//创建一张图片
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
		//得到该图片
		Graphics g = image.getGraphics();
		//设置图片的背景色
		g.setColor(Color.GRAY);
		//设置图片边框
		g.fillRect(1, 1, width-2, height-2);
		//设置边框颜色
		g.setColor(Color.blue);
		g.drawRect(0, 0, width, height);
		//设置干扰线颜色
		g.setColor(Color.white);
		//画干扰线
		Random r = new Random();
		for(int i=0;i<10;i++){
			g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
		}
		
		StringBuffer sb = new StringBuffer();
		g.setColor(Color.RED);
		Font f = new Font("宋体",Font.BOLD,30);
		g.setFont(f);
		int x=30;
		//在图片上写数字(也可以写其他的)
		for(int i=0;i<4;i++){
			String code = String.valueOf(r.nextInt(10));
			g.drawString(code, x, 25);
			x+=30;
			sb.append(code);
		}
		//将验证码存入session中,方便验证输入是否正确
		HttpSession session = request.getSession();
		session.setAttribute("scode", sb.toString());
		//将图片写给浏览器
		ImageIO.write(image, "jpg" , response.getOutputStream());
	}

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

}

2.在表单中使用验证码图片

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>验证码</title>
  </head>
  
  <body>
	<form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="post">
		用户名:<input name="name" type="text" /><br/>
		验证码:<input name="fcode" type="text"/>
			<img src="${pageContext.request.contextPath }/servlet/ImageServlet" width="200px" height="35px">
		<br/>
		<input type="submit" value="提交"/>
	</form>
  </body>
</html>

效果图:

3.服务器对提交的数据进行验证

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;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		String fcode = request.getParameter("fcode");
		HttpSession session = request.getSession();
		String scode = (String) session.getAttribute("scode");
		if (scode != null) {
			if (scode.equals(fcode)) {
				session.removeAttribute("scode");//第一次登陆成功之后移除session
				response.getWriter().write("success");
			} else {//验证码输出错误
				response.getWriter().write("false");
			}
		}else{//如果session不存在
			response.getWriter().write("resubmit");
		}
	}

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

}

猜你喜欢

转载自blog.csdn.net/ScongHW/article/details/81256338