Java Web 通过session实现一次性验证码

简介: Java Web 通过session实现一次性验证码

表单

<form action="loginServlet" method="post">
 请输入验证码:<input type="text" name="code" />
 <img src="getCodeServlet" /><br />
 <button type="submit">提交</button>
</form>

载入页面时,会自动请求getCodeServlet,获取图片(验证码)。
getCodeServlet,产生验证码

@WebServlet("/getCodeServlet")
public class GetCodeServlet extends HttpServlet {
  //验证码的宽、高
  private static int WIDTH=80;
  private static int HEIGHT=25;
  //绘制背景
  private void drawBg(Graphics g){
    //rgb
    g.setColor(new Color(128, 128, 128));
    //绘制矩形。x,y,wigth,height
    g.fillRect(0,0,WIDTH,HEIGHT);
    //随机绘制100个干扰点
    Random random=new Random();
    for (int i=0;i<100;i++){
      //产生(0,1)上的小数,*WIDTH|HEIGHT,再取整也行
      int x=random.nextInt(WIDTH);
      int y=random.nextInt(HEIGHT);
      g.drawOval(x,y,1,1);
      //干扰点的颜色也可以随机,随机产生red,green,blue即可
      //g.setColor(new Color(red,green,blue));
    }
  }
  //绘制验证码
  private void drawCode(Graphics g,char[] code){
    g.setColor(Color.BLACK);
    //字体、样式(多个时竖线分隔)、字号
    g.setFont(new Font("serif",Font.ITALIC|Font.BOLD,18));
    //在不同位置绘制验证码字符,参数:要绘制的String、横、纵坐标。+""是为了char转String。
    g.drawString(code[0]+"",1,17);
    g.drawString(code[1]+"",16,15);
    g.drawString(code[2]+"",31,18);
    g.drawString(code[3]+"",46,16);
  }
  //随机产生4位验证码
  private char[] getCode(){
    String chars="0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
    char[] code=new char[4];
    Random random=new Random();
    for (int i=0;i<4;i++){
      //[0,62)
      int index= random.nextInt(62);
      code[i]=chars.charAt(index);
    }
    return code;
  }
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    HttpSession session = request.getSession();
    ServletOutputStream sos = response.getOutputStream();
    response.setContentType("image/jpeg");
    //设置浏览器不缓存此图片
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires",0);
    //创建内存图片
    BufferedImage bufferedImage = new BufferedImage(WIDTH, HEIGHT, TYPE_INT_RGB);
    Graphics g= bufferedImage.getGraphics();
    char[] code=getCode();
    //将验证码放到session域中。session对象要在提交响应之前获得
    session.setAttribute("code",new String(code));
    drawBg(g);
    drawCode(g,code);
    g.dispose();
    //将图片输出到浏览器
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage,"JPEG",baos);
    baos.writeTo(sos);
    baos.close();
    sos.close();
  }
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    doPost(request,response);
  }
}

loginServlet,处理表单

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    HttpSession session = request.getSession();
    String trueCode= (String) session.getAttribute("code");
    String code=request.getParameter("code");

    if (code.equals(trueCode)){
      response.getWriter().write("验证码正确");
    }
    else {
      response.getWriter().write("验证码错误");
    }
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request,response);
  }
}

上面的处理方式要区分验证码的大小写。

不区分大小写:

//先转换为全大写|全小写,再判断
    trueCode=trueCode.toLowerCase();
    code=code.toLowerCase();
    //trueCode=trueCode.toUpperCase();
    //code=trueCode.toUpperCase();
相关文章
|
3月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
403 1
|
3月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
407 0
|
4月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
546 64
|
4月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
353 1
|
5月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
624 0
|
5月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
387 0
|
10月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
687 7
|
10月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
1988 5
|
11月前
|
Kubernetes Java 持续交付
小团队 CI/CD 实践:无需运维,Java Web应用的自动化部署
本文介绍如何使用GitHub Actions和阿里云Kubernetes(ACK)实现Java Web应用的自动化部署。通过CI/CD流程,开发人员无需手动处理复杂的运维任务,从而提高效率并减少错误。文中详细讲解了Docker与Kubernetes的概念,并演示了从创建Kubernetes集群、配置容器镜像服务到设置GitHub仓库Secrets及编写GitHub Actions工作流的具体步骤。最终实现了代码提交后自动构建、推送镜像并部署到Kubernetes集群的功能。整个过程不仅简化了部署流程,还确保了应用在不同环境中的稳定运行。
643 9
|
2月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
267 4