采用java awt以及前端 java httpservlet方面的知识
环境要求:tomcat服务器知识
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="LoginCheckServlet" method="post">
<p>账号:<input type="text" name="userName"/></p>
<p>密码:<input type="password" name="userPwd"/></p>
<p>验证码:<input type="text" name="userCode" maxlength="4"/>
<img height="30" src="ValidateCodeServlet" width="100" id="validateCodeImg"/>
</p>
<p><input type="submit" value="登录"/></p>
</form>
<script type="text/javascript">
var img=document.getElementById("validateCodeImg");
img.onclick=function()
{
img.src="ValidateCodeServlet?m="+Math.random();
}
</script>
</body>
</html>
import java.io.IOException;
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;
/**
* Servlet implementation class LoginCheckServlet
*/
@WebServlet("/LoginCheckServlet")
public class LoginCheckServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginCheckServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//1.接收账号、密码、验证码
String userName=request.getParameter("userName");
String userPwd=request.getParameter("userPwd");
String usercode=request.getParameter("userCode");
//2.从session取出生成验证码时存储的正确的验证码
HttpSession session=request.getSession();
String vcode=(String) session.getAttribute("vcode");
//3.将用户输入的验证码和从session取出的正确的验证码进行对比
if(usercode.equals(vcode))
{
//验证码正确,继续校验账号和密码
System.out.println("----验证码正确");
}
else
{
//验证码错误
System.out.println("----验证码错误");
}
}
}
import java.awt.Color;
import java.awt.Font;
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.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class ValidateCodeServlet
*/
@WebServlet("/ValidateCodeServlet")
public class ValidateCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ValidateCodeServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//接收客户端请求生成验证码图片
//使用java提供的awt工具包动态生成一个验证码图片
//创建一行图片
int width=300;//验证码宽度
int height=90;//验证码高度
BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
//2.绘制图片
//从图片对象中获取绘制图片的“笔”
Graphics2D pen=image.createGraphics();
//绘制背景
pen.setColor(getRandomColor());
//绘制实心矩形
pen.fillRect(0, 0,width, height);
//绘制验证码字符串
int letterNum=4;
int space=20;
int letterWidth=(width-(letterNum+1)*space)/letterNum;//计算每个字母占据的宽度
//for循环每循环一次,绘制一个字母(小写字母ascii码 97-122)
String vcode="";
Random random=new Random();
for(int i=0;i<letterNum;i++)
{
//随机生成一个小写字母
int ascii=random.nextInt(26)+97;
byte[]bs= {(byte)ascii};
String letter=new String(bs);
vcode=vcode+letter;
//
pen.setColor(getRandomColor());
pen.setFont(new Font("Gulim",Font.BOLD,70));
pen.drawString(letter, space+(letterWidth+space)*i, height-space);
}
System.out.println("生成的验证码:"+vcode);
HttpSession session=request.getSession();
session.setAttribute("vcode", vcode);
//图片绘制完成之后,将图片通过response的输出流响应到客户端
ImageIO.write(image, "png", response.getOutputStream());
}
//产生一种随机颜色
private Color getRandomColor()
{
// int r=(int) Math.floor(Math.random()*256);
// int g=(int) Math.floor(Math.random()*256);
// int b=(int) Math.floor(Math.random()*256);
Random random=new Random();
int r=random.nextInt(256);
int g=random.nextInt(256);
int b=random.nextInt(256);
Color color=new Color(r,g,b);
return color;
}
}
点击验证码还会改变,最好在验证码上再加上几笔,避免图像识别出来