验证码的简单实现
程序员文章站
2022-05-24 20:50:09
...
本质:图片
目的:防止恶意表单注册
文章目录
一、基本实现
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 50;
//1.创建一对象,在内存中图片(验证码图片对象)
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//2.美化图片
//2.1 填充背景色
Graphics g = image.getGraphics();//画笔对象
g.setColor(Color.PINK);//设置画笔颜色
g.fillRect(0,0,width,height);
//2.2画边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width - 1,height - 1);
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
//生成随机角标
Random ran = new Random();
for (int i = 1; i <= 4; i++) {
int index = ran.nextInt(str.length());
//获取字符
char ch = str.charAt(index);//随机字符
//2.3写验证码
g.drawString(ch+"",width/5*i,height/2);
}
//2.4画干扰线
g.setColor(Color.GREEN);
//随机生成坐标点
for (int i = 0; i < 10; i++) {
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
g.drawLine(x1,y1,x2,y2);
}
//3.将图片输出到页面展示
ImageIO.write(image,"jpg",response.getOutputStream());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
结果如图:
二、配合 html 表单实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
/*
分析:
点击超链接或者图片,需要换一张
1.给超链接和图片绑定单击事件
2.重新设置图片的src属性值
*/
window.onload = function(){
//1.获取图片对象
var img = document.getElementById("checkCode");
var change = document.getElementById("change");
//2.绑定单击事件
img.onclick = function(){
//加时间戳,是为了防止图片由于浏览器优先读取浏览器缓存而不更新
var date = new Date().getTime();
img.src = "/day15/checkCodeServlet?"+date;
}
//
change.onclick = function () {
var time = new Date().getTime();
image.src = "/code?" + time;
}
}
</script>
</head>
<body>
<img id="checkCode" src="/day15/checkCodeServlet" />
<a id="change" href="/code">看不清换一张?</a>
</body>
</html>
这里为了达到点击图片自动更换的效果,加了个时间戳
image.src = "/code?" + time;
这里的?和 time
,没有任何意义,效果是让浏览器认为这是次新的刷新,不会去读取浏览器缓存
但是这里也存在个问题,点击图片实现自动更改,但是实际上是跳转到了另外一个***的页面,没有停留在 register.html 页面,所以点击文字"看不清,换一张",只会出现一次效果
所以实际上,<a>
标签实现的是本页面的一个跳转,可以用以前学的一个
<a id="change" href="javascript:void(0);">看不清换一张</a>
然后通过 id ,添加事件即可
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>验证码</title>
<script>
window.onload = function () {
var image = document.getElementById("checkCode");
var change = document.getElementById("change");
image.onclick = function () {
var time = new Date().getTime();
image.src = "/code?" + time;
}
change.onclick = function () {
var time = new Date().getTime();
image.src = "/code?" + time;
}
}
</script>
</head>
<body>
<img id="checkCode"src="/code"/>
<a id="change" href="javascript:void(0);">看不清换一张</a>
</body>
</html>
上一篇: Django项目创建教程