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

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

二.图文验证码的原理

在 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. dede使用方法----如何自定义字段

    我们在用dede做东西的时候,有时候需要添加一些dede里面没有的字段,有dede后台里面可以添加相关的自段,下面我就以如何给产品添加一个价格的字段来讲述一下如何给dede添加字段,并且调用它. 1. ...

  2. C# asp.net mvc 配置多个route 参数

    mvc 中路由可以自定义 public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { ...

  3. remove duplicated gene pair using awk

    cat input.txt TRINITY_DN106621_c0_g1_i1 TRINITY_DN129833_c0_g1_i2 TRINITY_DN106621_c0_g1_i1 TRINITY_ ...

  4. Java中Comparable和Comparator区别小结

    一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...

  5. SQLAlchemy 操作数据库

    首先安装 SQLAlchemy install PyMySQL install sqlalchemy 代码: #!/usr/bin/env python # encoding: utf-8 " ...

  6. Matlab中fsolve传递系数变量

    比如AX= b,求解x,但是要找不同b下的x,100个b. fsolve(‘fun,[X0,b])这样是不行的,因为这样的话b也当成了变量,也会变. 两种方法 1.全局变量 global b;多个的话 ...

  7. 雷赛dmc2410控制卡,驱动器 光栅 加电机

    一般驱动器为9pin接口:(1:VCC 2:限位近端 3:限位远端 4:GND):电源是供给限位器的 ,5:A+ 6:A- 7:B+ 8:B- 注意驱动器的电流大小和细分设置,电流一般1A左右 电流过 ...

  8. PHP守护进程

    php也是可以直接进行守护进程的启动与终止的,相对于shell来说会简单很多,理解更方便,当然了php的守护进程要实现自动重启还是要依赖于shell的crontab日程表,每隔一段时间去执行一次脚本看 ...

  9. HDU 1166 敌兵布阵(线段树模板题)

    题目链接: 传送门 敌兵布阵 Time Limit: 2000MS     Memory Limit: 32768 K Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头 ...

  10. 软件工程个人作业-Week2

    第一部分  调研, 评测 必应词典客户端版本:安卓版5.2.2 bug描述一:在学习页面点击“单词挑战”或“我爱说英语”会弹出“加载失败,请稍后重试”,无论点击多少次都加载不出来. bug描述二:在未 ...