//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>
绘制图片并验证验证码输入是否有误
最新推荐文章于 2021-01-05 14:43:13 发布