jsp+servlet实现登陆验证码

  • 验证码的作用
    • 效果图
    • 验证码生成原理
    • servlet在web.xml中的配置
    • 验证码图片显示
      • 登陆处理的servlet
      • 登陆失败提示
      • 流程总结
    • 其他常见的验证码

验证码的作用

避免暴力注册,登录,论坛灌水

效果图

验证码生成原理

使用Java图形界面技术AWT或者Swing生成验证码


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
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 RandomServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 创建验证码图片int width = 110, height = 30;//设置图片大小BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);// 获取图形上下文Graphics g = image.getGraphics();// 生成随机类Random random = new Random();// 设定背景色g.setColor(getRandColor(200, 250));//调用自定义方法生成随机rgb颜色g.fillRect(0, 0, width, height);// 设定字体g.setFont(new Font("Times New Roman", Font.PLAIN, 20));// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到g.setColor(getRandColor(160, 200));for (int i = 0; i < 155; 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);}// 取随机产生的认证码(6位数字)String sRand = "";for (int i = 0; i < 6; i++) {String rand = String.valueOf(random.nextInt(10));sRand += rand;// 将认证码显示到图象中g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成g.drawString(rand, 13 * i + 6, 16);}// 图象生效g.dispose();try {//响应图片到客户端浏览器ImageIO.write(image, "JPEG", response.getOutputStream());} catch (Exception e) {System.out.println("验证码图片产生出现错误:" + e.toString());}//保存验证码到Session,用于登陆验证request.getSession().setAttribute("randStr", sRand);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}/** 给定范围获得随机颜色*/private Color getRandColor(int fc, int bc) {Random random = new Random();if (fc > 255)fc = 255;if (bc > 255)bc = 255;int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);}
}

servlet在web.xml中的配置

 <servlet><servlet-name>RandomServlet</servlet-name><servlet-class>com.bjsxt.servlet.RandomServlet</servlet-class></servlet><servlet-mapping><servlet-name>RandomServlet</servlet-name><!--为了避免泄露,url装作成一张图片--><url-pattern>/random.jpg</url-pattern></servlet-mapping>

验证码图片显示

<span>
<input name="verifyCode" type="text" value="验证码" onclick="JavaScript:this.value=''"/>
</span>
<cite>
<img src="random.jpg" alt="" id="randImg" onclick="changeRandom()"/>
</cite>

通过图片的src属性,向servlet发送请求,获取到响应回来的图片加载到图片标签中;
通过设置验证码的点击事件,实现点击验证码刷新

function changeRandom(){//修改图片的地址//防止页面缓存,刷新验证码图片的时候添加一个参数,每次发送的时候值不同即可,这里利用的是当前系统时间$("#randImg").attr("src","random.jpg?time="+new Date().toLocaleString());
}

登陆处理的servlet

public void login(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//获取登录信息String empId = request.getParameter("empId");String password = request.getParameter("password");String verifyCode = request.getParameter("verifyCode");//用户输入的验证码String randStr = (String)request.getSession().getAttribute("randStr");//正确的验证码if(verifyCode ==null || !verifyCode.equals(randStr)){//登陆失败,返回登陆页面,显示错误信息request.setAttribute("error", "验证码错误");request.getRequestDispatcher("/login.jsp").forward(request, response);return;//return不可少  }//调用业务层完成登录操作EmployeeService  empService = new EmployeeServiceImpl();Employee emp =empService.login(empId,password);//页面跳转if(emp != null){//将员工信息保存在session中request.getSession().setAttribute("emp", emp);//!!!!!response.sendRedirect(request.getContextPath()+"/main.html");}else{//登陆失败,返回登陆页面,显示错误信息request.setAttribute("error", "用户名或者密码错误");request.getRequestDispatcher("/login.jsp").forward(request, response);}}

登陆失败提示

     ${error }<!--登陆失败回到登陆页面,显示错误信息--><form action="servlet/EmployeeServlet?method=login" method="post"><ul><li><input name="empId" type="text" class="loginuser" value="liukaili" onclick="JavaScript:this.value=''"/></li><li><input name="password" type="password" class="loginpwd" value="123456" onclick="JavaScript:this.value=''"/></li><li class="yzm"><span><input name="verifyCode" type="text" value="验证码" onclick="JavaScript:this.value=''"/></span><cite><img src="random.jpg" alt="" id="randImg" onclick="changeRandom()"/></cite> </li><li><input name="" type="submit" class="loginbtn" value="登录"  /><label><input name="" type="checkbox" value="" checked="checked" />记住密码</label><label><a href="#">忘记密码?</a></label></li></ul></form>

流程总结

  • 进入登陆页面,通过验证码图片的src属性向服务器申请图片
  • tomcat接收到请求以后,根据web.xml中配置的servlet映射信息,找到对应的servlet来处理这个请求,即RandomServlet
  • RandomServlet接收到请求,利用awt技术生成一张图片,响应回客户端,显示到浏览器中;同时把生成的随机验证码文本信息存放到session中
  • 点击登陆按钮,发送登陆请求
  • tomcat接收到请求以后,根据web.xml中配置的servlet映射信息,找到对应的servlet来处理这个请求:获取请求中的用户名、密码、验证码进行判断;先判断请求中的验证码是否与session中存放的验证码是否一致;再判断用户名密码是否匹配;根据不同的结果做出不同的响应

其他常见的验证码

网易滑块验证码

12306充满想象力的验证码

jsp+servlet实现登陆验证码相关推荐

  1. JSP+servlet生成验证码并验证

    生成验证码的基本过程是: <%@ page language="java" import="java.util.*" pageEncoding=" ...

  2. 基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能

    本案例的技术选型主要是jsp+servlet+JavaBean,采用三层架构的分层思想与MVC设计模式结合进行规范开发. 采用的数据库是MySQL,并且搭配数据源连接池DBCP和apache官方提供的 ...

  3. Jsp+Servlet+JavaBean实现最基本的注册登陆功能

    Jsp+Servlet+JavaBean是MVC思想,Jsp=V(视图) Servlet=C(控制器) JavaBean=M(模型) 一.创建一个注册页面和登陆页面(V层) <html> ...

  4. 编程小白的计算机毕业设计指导开发教程-JSP+Servlet实现注册登陆功能

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  5. Java项目:嘟嘟校园一卡通系统(java+JSP+Servlet+html+css+JavaScript+JQuery+Ajax+mysql)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 功能:卡管理,卡消费,卡充值,图书借阅,消费,记录,注销等等功能. 二.项目运行 环境配置: Jdk1.8 + Tomcat8 ...

  6. 基于JavaWeb Mybatis+MVC(JSP + servlet + javabean)的高校就业管理系统(含项目源码)

    基于JavaWeb Mybatis+MVC的高校就业管理系统 项目简介 基本功能简介 项目要求 概要设计 数据模型(E-R图) 数据库结构设计 主要页面展示 项目实现 创建项目 项目结构展示 项目关键 ...

  7. 使用JSP/SERVLET实现在校学生管理系统

    项目编号: BS-GX-012 本系统基于JSP/SERVLET技术开发实现,前端采用easyui进行页面设计,用户交互性好,采用三层架构,MVC设计模式,数据库采用MYSQL数据库,开发工具为IDE ...

  8. 基于JSP/SERVLET学生管理系统

    项目编号:BS-GX-012  本系统基于JSP/SERVLET技术开发实现,前端采用easyui进行页面设计,用户交互性好,采用三层架构,MVC设计模式,数据库采用MYSQL数据库,开发工具为IDE ...

  9. JSP/Servlet实验室设备管理系统文档

    项目编号:BS-XX-013 本项目基于JSP/Servlet技术实现开发,开发工具采用IDEA或ECLIPSE,数据库采用MYSQL数据库. 首次使用,需要进入src/com/util/DBOK 修 ...

最新文章

  1. 移动端手机网站建设应注意哪些问题?
  2. LCD 常用的客观效果指标和测试方法
  3. 探讨如何成为技术团队管理者
  4. VTK:图片之ImageSeparableConvolution
  5. 通过Kubernetes安全高效管理边缘节点,ACK@Edge年度重磅发布
  6. 【计组实验】P2 Modelsim Verilog单周期处理器开发 MIPS指令集
  7. 大话数据结构 01 :顺序线性表
  8. 手机展示海报就用它 再不要羡慕别人
  9. java jdbc oracle rac_JDBC连接oracle RAC数据库配置
  10. Docker 容器操作
  11. python的networkx 算法_python图算法库Networkx笔记 - Node and Centrality
  12. Google Maps API v3:如何删除所有标记?
  13. React/Router
  14. tif格式怎么转jpg格式
  15. 三星android文件传输,三星手机怎么连接电脑?三星手机连接电脑传输文件教程...
  16. tinyxml2库的使用
  17. ioppc技术_广东电网有限责任公司河源供电局基于IOPPC线路光纤网络智能态势感知技术研究技术服务等5个项目采购公告...
  18. java自定义数组_Java自定义数组
  19. css实现鼠标禁用(鼠标滑过显示红色禁止符号)
  20. c语言和java哪个有前途_C/C++和JAVA哪个更有前途呢?

热门文章

  1. 云厂商之战,战至“边缘”
  2. 超酷幽默搞笑的摄影作品
  3. 设计原则之迪米特法则详解
  4. 2020第十一届至2022年第十三届蓝桥杯单片机开放与设计省赛第二批客观题及简解整理
  5. sql实现四舍五入保留两位小数,小数不足自动补0
  6. 几款好用又不贵的BI工具值得推荐
  7. 油猴编写-使用Bootstrap
  8. 怎么样喝酒才会不那么容易喝醉?
  9. NLB服务搭建与WDS服务搭建
  10. 44、基于51单片机水位检测远程GSM短信控制系统设计