一.什么是验证码及它的作用

验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答. 可以防止恶意破解密码、刷票、论坛灌水、有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录。

二.图文验证码的原理

在 servlet中随机生成一个指定位置的验证码,一般为四位,然后把该验证码保存到session中.在通过Java的绘图类以图片的形式输出该验证码。 为了增加验证码的安全级别,可以输出图片的同时输出干扰线,最后在用户提交数据的时候,在服务器端将用户提交的验证码和Session保存的验证码进行比 较。

三.验证码所需的技术

i.因为验证码中的文字,数字,应为都是可变的,故要用到随机生成数技术。

ii.如果验证码中包含汉字,则要用到汉字生成技术.

iii.可以使用Ajax技术实现局部刷新

iv.可以使用图片的缩放和旋转技术,

vi.随机绘制干扰线(可以是折现,直线等)

vii.如果考虑到验证码的安全性,可以使用MD5加密.

操作代码有流程

1.代码先新建UserServlet.java也就是servlet文件

package controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
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 UseryanServlet extends HttpServlet {
//定义一个方法可以获取到a-z或A-Z或0-9的ASCII码值的随机数
public int ro() {
int b = 0;
Random r = new Random();
while (true) {
int a = (int) (r.nextDouble() * 123);
if ((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z')
|| (a > 47 && a < 58)) {
b = a;
break;
}
}
return b;
} public UseryanServlet() {
super();
} /**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 定义大小的值
int width = 120, height = 25;
// 在内存产生一个图片
BufferedImage bimage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);
//得到画笔
Graphics g = bimage.getGraphics();
//一个矩形
g.setColor(Color.blue);
g.drawRect(0, 0, width, height);
//画填充背景 
g.setColor(Color.red);
g.drawRect(1, 1, width - 2, height - 2);
//画干扰线条 20条
g.setColor(Color.gray);
Random r = new Random();
for (int i = 1; i < 20; i++) {
g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width),
r.nextInt(height));
}
// 画随机数字
g.setColor(Color.yellow);
g.setFont(new Font("黑体", Font.BOLD | Font.ITALIC, 20)); String code = "";//生成的随机数返回到code
// 生产4个随机数字
for (int i = 0; i < 4; i++) {
char a = (char)ro();
code += a+"";
g.drawString(a + "", 20 * i, 20);
}
request.getSession().setAttribute("captcha", code);//获取验证码到UserLoginServlet进行验证
// 输出图像到页面
response.setContentType("image/jpeg");
ImageIO.write(bimage, "jpg", response.getOutputStream());
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { this.doGet(request, response); } public void init() throws ServletException {
super.init();
}
}

2.在登录的UserLoginServlet对输入的验证码进行判断

String captcha = (String) request.getSession().getAttribute("captcha");
if(!captcha.equalsIgnoreCase(newCaptcha)) {
request.setAttribute("errorMsg", "验证码输入错误");
request.getRequestDispatcher("/WEB-INF/jsp/error.jsp").forward(request, response);
return;
}

3..在web.xml文件找到对应的UseryanServlet方法

<servlet-mapping>
    <servlet-name>UseryanServlet</servlet-name>
    <url-pattern>/UseryanServlet</url-pattern>
  </servlet-mapping>

4.在登录首页进行设置

<input name="captcha" type="text" placeholder="验证码"><img src="UseryanServlet"></td>

name="captcha"输入到UserLoginServlet对验证码进行判断后的String captcha = (String) request.getSession().getAttribute("captcha");

后台的验证码通过src="UseryanServlet"获取 在web.xml文件找到对应的UseryanServlet方法,

判断正确才允许登录。

登录验证码编写(jsp+servlet+dao)的更多相关文章

  1. JSP+Servlet+DAO+Javabean模式小记-20171029

    1.Servlet的doPost方法使用request.getParameter()接收网页传送的form表单数据时,必须使用name属性,而不能使用id. 2.这是最简单的MVC模式,其中M(mod ...

  2. 我能不能理解成 ssh中service就相当于与jsp+servlet+dao中的servlet???

    转文 首先解释面上意思,service是业务层,dao是数据访问层.(Data Access Objects) 数据访问对象 1.Dao其实一般没有这个类,这一般是指java中MVC架构中的model ...

  3. (详细)Eclips+jsp+servlet+mysql+登录实例+源代码

    欢迎任何形式的转载,但请务必注明出处. 该教程较全,从软件的安装以及相关的环境配置我都放置了相关教程的链接,读者可直接点击进入.自己写电商网站作业时查找了很多资料,但都不是很全,所以趁着寒假写了这份教 ...

  4. jsp+servlet+mysql 实现简单的银行登录转账功能

    jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...

  5. JSP+servlet简单登录实例

    一个简单的jsp+servlet实例,实现简单的登录 转载▼ http://blog.sina.com.cn/s/blog_5c5bc9070100z7wb.html     开发环境myeclips ...

  6. jsp&servlet初体验——用户登录功能实现

    数据库准备-创建db_login数据库  t_user表 1.创建web工程 2.创建用户model   user.java package com.gxy.model; public class U ...

  7. Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题

    日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...

  8. jsp+servlet登录框架模板

    一.建立一个名叫jsp_servlet的工程 二.建立一个AcountBean类和CheckAccount类 1.AcountBean类包含登录名(username)和登录密码(password) p ...

  9. Java Web项目案例之---登录注册和增删改查(jsp+servlet)

    登录注册和增删改查(jsp+servlet) (一)功能介绍 1.用户输入正确的密码进行登录 2.新用户可以进行注册 3.登录后显示学生的信息表 4.可以添加学生 5.可以修改学生已有信息 6.可以删 ...

随机推荐

  1. js 打开窗口window.open

    js改变原有的地址 window.open(webPath+'/index?code='+code,'_self');

  2. git初体验(三)git分支

    分支的理念就是分身,就像孙悟空拔出猴毛变出很多跟自己一模一样的猴子,然后每个猴子做自己的事情互不干涉,等到所有猴子做完之后,猴子集合来合并劳动成果,然后悟空就把那些猴子猴孙门统统收回了. 你创建了一个 ...

  3. 在浏览器中输入URL后执行的全部过程的个人总结

    这个问题经常可以看到,今天我好好总结了下,是从网络模型的角度来分析问题的,主要涉及应用层:DNS,HTTP,传输层:TCP,网络层:IP和路由选择协议:RIP,OSPF(内部网关协议),BGP(外部网 ...

  4. python协程和yeild

    python多线程其实在操作系统级别是进程,因为在执行时,默认加了一个全局解释器锁(GIL),python的多线程,本质还是串行的,无法利用多核的优势:在java和C# 中,多线程是并发的,可以充分利 ...

  5. 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

    3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] ...

  6. 修改ftp端口为50021

    1. 配置 2. 增加防火墙规则 netsh firewall set portopening tcp 50021 ftp-50021 enable 3. 重启服务 net stop FileZill ...

  7. ubuntu常见错误--could not get lock /var/lib/dpkg/lock -open

    最近研究ubuntu,用apt-get命令安装一些软件包时,总报错:E:could not get lock /var/lib/dpkg/lock -open等 出现这个问题的原因可能是有另外一个程序 ...

  8. Python3导入cookielib失败

    Python 3 改成 http.cookiejar了,所以只要改成import http.cookiejar就自动导入cookiejar了,如果还是不行,就把所有的.pyc删掉试试.

  9. POJ 3617 Best Cow Line (贪心)

    Best Cow Line   Time Limit: 1000MS      Memory Limit: 65536K Total Submissions: 16104    Accepted: 4 ...

  10. JavaScript制作时钟特效

    需求说明:制作显示年.月.日.星期几并且显示上午(AM)和下午(PM)的 12进制的时钟,具体效果如下所示: 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C// ...