欢迎来到Introzo百科
Introzo百科
Servlet生成验证码,通过账号密码和验证码验证登录!
-->
前言:人不是生来就懂事的,编程的世界也是如此。想想我大一的时候,还是那个连Hello World都不会输出的人!不知道怎么做的孩子是,但现在我可以编写自己的小程序了。编程其实并不可怕。可怕的是你不对其进行编程。现在我大三了,正在训练,时间很紧张。我尝试每周发布一条微博。今天我想谈谈验证码登录的问题。在网上查阅了相关知识,感觉网上的资料大多只是提供了如何生成验证码的信息,并没有对相关信息进行系统验证。今天我整理了一下。
生成验证码
- 我们需要使用Servlet来生成验证码。验证码其实是一张图片,所以我们先定义一下图片的背景
- BufferedImage img=new BufferedImage(宽度,高度,BufferedImage.TYPE_INT_RGB);
- 那我们需要一支画笔
Graphics2D g=(Graphics2D) img.getGraphics();
- 拿到画笔后我们就开始画画了
g.fillRect(120, 120, 宽度, 高度);
- g.drawRect(120, 120, 宽度-1, 高度-1);
画好基本框架后,开始填写数字
for(int i=0;i<4;i++)
{
int r=RandNum(9);
验证码+=r+"";
g.setColor(new Color(RandNum(255), RandNum(255), RandNum(255)));
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString(r+"", 5+i*30, 22);
}
大家应该都见过验证码是什么样的。验证码给人一种模糊的感觉。那么接下来我们要做的就是用点和线填充这个框,营造出一种模糊的感觉
for (int i=0;i<255;i++) {
int x = random.nextInt(宽度);
int y = random.nextInt(高度);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x,y);
- 至此我们已经完成了验证码的绘制,现在我将其发布到浏览器
ImageIO.write(img, "jpg", response.getOutputStream());
- 这里还有一点值得注意的是,我们还需要自己存储随机生成的四位验证码,以便登录时进行验证
- `public String GetAuthCode()
{
字符串授权码=“”;
for(int i = 0; i < 4; i++)
{
authcode += (new Random()).nextInt(10);
}
返回授权码;
- `public String GetAuthCode()
}`
- 我将使用HttpSession来存储我们在这里得到的验证码。
request.getSession().setAttribute("AuthCode", AuthCode);//保存到session中进行验证
- 我们需要使用Servlet来生成验证码。验证码其实是一张图片,所以我们先定义一下图片的背景
生成验证码的工作到此结束,在线版也到此结束。接下来,我必须执行登录验证。因为是演示,所以不能带数据库,所以我在程序中模拟了一个数据库。来进行账户验证。
我使用map来存储模拟数据的键值对,这样方便我们搜索
UserInfor u1=new UserInfor("张新华", "123");
UserInfor u2=new UserInfor("奥巴马", "456");
UserInfor u3=new UserInfor("***", "789");
UserInfor u4=new UserInfor("阿部", "1234");
UserInfor u5=new UserInfor();
map.put(u1.getUserName(), u1);
map.put(u2.getUserName(), u2);
map.put(u3.getUserName(), u3);
map.put(u4.getUserName(), u4);
map.put(u5.getUserName(), u5);
在这个数据库中我提供了验证方法来验证账号和密码是否正确
if(map.containsKey(name)&&map.get(name).getPwd().equals(pwd))
{
返回map.get(名称);
}
- 在上面的数据库中,不难发现有一个用户数据类,所以接下来我们要构造这个数据类。这里我给用户提供了用户名和密码
私有字符串用户名;
私有字符串密码;这个类的参数和访问器我就不写了,自动生成即可
- 以下是我们的主菜。这里我们需要构造一个Servlet来接管我们之前的验证码。最好使用HTML(实际上我是在Servlet中编写Html)。我将其命名为 IndexServlet
- 在DoGet方法中我们必须告诉浏览器不要缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("缓存控制", "无缓存");
response.setDateHeader("过期", -1);- 在首页,我们要判断用户是否已经登录或者是第一次回来
String err=(String) session.getAttribute("errmsg");
错误=错误==空? ““ : 呃;
String errv=(String) session.getAttribute("errvalid");
errv=errv==null ? “”:错误;
String name=request.getParameter("用户名");
名称 = 名称 == null ?"" : 名称;
out.write(""+err+"");
out.write(""+errv+"");
session.removeAttribute("errmsg");
session.removeAttribute("errvalid");
out.append("");
out.append("");
- 如果登录成功,您将跳转到我们的欢迎界面
out.write("欢迎光临");
out.write("");
out.write(userInfor.getUserName());
out.write("");
out.write("回来吧"+""+"退出 a>");
- 在上面的IndexServlet中,我提到了登录成功接口,这里我将其命名为LoginOutServlet。这个Servlet实现用户推送功能特别简单,所以我们只需要删除session中的数据,那么问题是如果直接删除的话,一旦我们的网页受到攻击,服务器就会不堪重负,所以我加了限制
HttpSession session=request.getSession(false);
if(会话!=null)
会话.invalidate();
response.sendRedirect(request.getContextPath()+"/IndexServlet");
- 最后是我们的验证界面。我们的账户和密码匹配已经写在我们的模拟数据库中了,那为什么还需要验证呢?你忘了我们还有验证码吗?另外,我的数据库只是验证账号和密码是否匹配,并没有做任何事情,所以我们还需要一个servlet来实现验证
String name=request.getParameter("用户名");
// 名称=名称==null ?"" : 名称;
String pwd=request.getParameter("pwd");
String code=request.getParameter("code");
UserInfor userInfor=UserDao.CheckInfor(name, pwd);
HttpSession 会话=request.getSession();
String AuthCode=(String) session.getAttribute("AuthCode");
// System.out.println(AuthCode+"--------"+code);
if(AuthCode.equals(code))
{
if(userInfor==null)
{
//失败
session.setAttribute("errmsg", "用户名或密码错误!");
response.sendRedirect(request.getContextPath()+"/IndexServlet?username="+name);
// System.out.println("1");
}
否则
{
//成功
response.setContentType("text/html;charset=utf-8");
session.setAttribute("userInfor", userInfor);
response.setHeader("刷新", "3;url="+request.getContextPath()+"/IndexServlet");
response.getWriter().write("恭喜!登录成功!");
// System.out.println("2");
}
}
否则
{
// System.out.println("3");
//验证码错误
session.setAttribute("errvalid", "验证码错误!");
response.sendRedirect(request.getContextPath()+"/IndexServlet?username="+name+"&pwd="+pwd);
}
- 在DoGet方法中我们必须告诉浏览器不要缓存
- 至此我们的验证登录功能就已经实现了。我们从 IndexServlet 页面开始。不要犯错误。我写这个博客主要是为了帮助像我这样志同道合的人一起学习和讨论。以下是我的运行过程
- 我会在下面填写正确的数据来看看效果
-
- 验证码错误时
- 密码错误
- -->
相关文章
- 10-06 2022年中国调味品行业发展趋势:健康概念成为消费
- 10-06 2022-2023年中国调味品行业:市场规模与消费
- 10-06 2022年中国调味品行业趋势:疫情推动行业分销渠道
- 10-06 对标大厂,微服务网关应该这样设计!
- 10-06 对标大厂,微服务网关应该这样设计!
- 10-06 摆脱恼人的 NullPointerExceptio
- 10-06 2.7k star,最强大的开源支付系统,马上就可
- 10-06 2.7k star,最强大的开源支付系统,马上就可
- 10-06 基于标签的时间跟踪工具 Traggo
- 10-06 面试官问我,try catch 应该放在 for
- 10-06 面试官问我try catch应该在for循环里面还
- 10-06 RocketMQ源码分析监控指标分析
- 10-06 《硬盘磁头修复》:让您的数据恢复如初! (硬盘磁头
- 10-06 教你如何在电脑店恢复丢失的U盘数据(电脑店U盘数据
- 10-06 如果手机上存储的数据被破坏了怎么办? (手机数据分
- 10-06 九月开学季新教师亮相班美丽句子(九月开学季美丽句子
- 10-06 UiPath 在 3B 轮 C 轮融资中获得 2.
- 10-06 什么是长焦镜头,什么是广角镜头(什么是长焦镜头)
- 10-06 vs2010对应msdn下载_如何下载安装Visu
- 10-06 stm32芯片焊接方向(stm32芯片焊接教程)
- 最近发表