JSP页面的验证码生成,验证

时间:2022-04-23 17:09:24

在诸如注册,登录页面必不可少的就是验证码了,这里分享一下最简单的JSP页面的验证码生成,验证的功能

先看看JSP页面,在验证码部分的显示界面如下:JSP页面的验证码生成,验证

使用时,如果看不清楚或输入错误,可以单击图片重新获取验证码

下面先看看JSP页面验证码部分的代码:

<td>
输入验证码<br>
<input type="text" name="uyzm">
<img border=0 src="ImageServlet"
onclick="this.src='ImageServlet?'+Math.random();"></img>
<br>看不清点击图片换一换
</td>

接下来是配置文件web.xml:

JSP页面的验证码生成,验证

接下来是服务器上要产生图片的servlet,代码如下:

import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import java.util.Random;
import javax.servlet.*;
import javax.servlet.http.*;
public class ImageServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Pragma", "No-cache");// 设置页面不缓存
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
int width = 60, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);// 在内存中创建图象
Graphics g = image.getGraphics();// 获取图形上下文
Random random = new Random();// 创建随机数对象
g.setColor(new Color(255,255, 255));// 设定背景色
g.fillRect(0, 0, width, height);// 设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 随机产生干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(Color.red);//这里的Color设置的是干扰线的颜色,可随意更改
for (int i = 0; i < 20; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}//这里的循环的i=20,是设置的干扰线的条数,太大的话会造成验证码的数字看不清楚
String sRand = "";
for (int i = 0; i < 4; i++) {
String rand = String.valueOf(random.nextInt(10));
sRand += rand;// 取随机产生的认证码(4位数字)
g.setColor(new Color(30 + random.nextInt(160), 40 + random
.nextInt(170), 40 + random.nextInt(180)));
g.drawString(rand, 13 * i + 6, 16);// 将认证码显示到图象中
}
request.getSession().setAttribute("yzm", sRand);// 将认证码存入SESSION
g.dispose();
ImageIO.write(image, "JPEG", response.getOutputStream());// 输出图象到页面
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}

图片已经生成好了,现在在JSP页面中已经能刷出验证码了,接下来可以在进行数据处理的servle

中添加验证方法了,比如我的JSP验证码是随着注册页面的form表单提交的,我就在表单提交的目的servlet中添加方法

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 bean.UserDao;

public class loginServlet extends HttpServlet{
/**实现验证码的验证
* 若验证码正确,没有其他异常,将收到的数据写入数据库
*/
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
request.setCharacterEncoding("gbk");//设置编码
response.setCharacterEncoding("gbk");//设置编码
PrintWriter out=response.getWriter();
String username = request.getParameter("username");
String pwd=request.getParameter("pwd");
String email=request.getParameter("email");
String name=request.getParameter("name");
String sex=request.getParameter("sex");
String contry=request.getParameter("coutry");
String province=request.getParameter("province");
UserDao ud=new UserDao();

//以下是验证码的验证
String uyzm=request.getParameter("uyzm");//获取JSP页面输入的验证码数字
String yzm=request.getSession().getAttribute("yzm").toString();//拿到服务器端产生的图片上的数字
if(!uyzm.equals(yzm)){                            //比较值
response.sendRedirect("loginerr.jsp?err=验证码错误");}
else{
try {
ud.insert(username, pwd, email, name, sex, contry, province);
} catch (Exception e) {
e.printStackTrace();
}
out.println("注册成功");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException{
doGet(request,response);
}
}

当然这个servlet也需要在web.xml中配置

现在一个最简单的JSP页面的验证码已经完成了