1.首先看一下基本的流程

2.看一下代码

   注:其中用到的一些工具类,可以到我的github上去下载

     https://github.com/hjzgg/usually_util/tree/master/utils

    windows 下的 redis下载

    https://github.com/hjzgg/redis

  获取验证码的tooken

   @RequestMapping(value="loginCode")@ResponseBodypublic String getCode(){PrintWriter out = null;JSONObject jsono = new JSONObject();try {       //验证码工具类ValidateCode vCode = new ValidateCode(55,25,4,80);String randomCode = vCode.randomCode();String encCode = DesUtil.strEnc(randomCode+System.currentTimeMillis(), "1", "2", "3");//存储验证码字符串,过期时间为1分钟
            redisTemplate.opsForValue().set(encCode, randomCode);redisTemplate.expire(encCode, 1, TimeUnit.MINUTES);//存储验证码生成器,过期时间为1分钟redisTemplate.opsForValue().set(encCode+"ValidateCode", SerializeUtil.serialize(vCode));redisTemplate.expire(encCode+"ValidateCode", 1, TimeUnit.MINUTES);jsono.put("success", true);jsono.put("message", encCode);} catch (Exception e) {e.printStackTrace();jsono.put("success", true);jsono.put("message", "inner error.");} finally{if(out != null) {out.flush();out.close();}}return jsono.toString();}

  本例中的tooken是通过加密生成的,加密串为 验证码+当前时间。或者采用UUID生成唯一tooken,都是可以得。生成ValidateCode(验证码工具类),然后将键值对(tooken,ValidateCode)放入redis中。

   获取验证码图片

  @RequestMapping(value="loginCodeImage")public void getCodeImage(String codeAuth, HttpServletResponse response){if(codeAuth == null) return;String randomCode = (String) redisTemplate.opsForValue().get(codeAuth);if(randomCode == null) return;ValidateCode vCode = (ValidateCode)SerializeUtil.unserialize((byte[])redisTemplate.opsForValue().get(codeAuth+"ValidateCode"));//产生图片
        vCode.createCode(randomCode);if(vCode == null) return;// 设置响应的类型格式为图片格式  response.setContentType("image/jpeg");  //禁止图像缓存。  response.setHeader("Pragma", "no-cache");  response.setHeader("Cache-Control", "no-cache");  response.setDateHeader("Expires", 0);  try {vCode.write(response.getOutputStream());} catch (IOException e) {e.printStackTrace();}  }

  根据tooken,在redis中找到对应的ValidateCode(验证码工具类),生成验证码图片。

3.前台获取验证码

  网页中获取

    <img src="htpp://......"/>

java中获取

  public static ImageIcon getCodeImage(){String data = JavaRequest.sendPost("loginCode", null);JSONObject result = JSONObject.fromObject(data);if((Boolean) result.get("success")){JavaRequest.codeAuth = result.getString("message");ImageIcon codeImg = null;try{codeImg = new ImageIcon(new URL(“.....”));} catch (Exception e) {e.printStackTrace();return null;}return codeImg;} else {System.out.println("获取验证码图片: " + result);return null;}}ImageIcon codeImg = JavaRequest.getCodeImage();if(codeImg == null){codeImg = new ImageIcon("获取失败的图片.png");}  /   JLable codeImgLabel = new JLabel(codeImg);

转载于:https://www.cnblogs.com/hujunzheng/p/5490899.html

不使用session,借助redis实现验证码相关推荐

  1. SpringSecurity OAuth2实现单点登录,微信扫码登录,Redis缓存验证码---入门到实战

    1. 认证授权 1.1 什么是认证授权 ​ 例如课程发布后用户通过在线学习页面点播视频进行学习.如何去记录学生的学习过程呢?要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么时间学习什 ...

  2. 整合rabbitmq+redis发送验证码消息

    文章目录 配置: 验证码工具类 处理发送验证码的消息 controller层 验证验证码是否正确 配置: server:port: 8084 #邮件相关配置 spring:application:na ...

  3. vue+springboot+阿里云短信服务(集成redis实现验证码登录业务)

    阿里云短信服务-介绍 阿里云短信服务(Short Message Service)是广大企业客户快速触达手机用户所优选使用的通信能力.调用API或用群发助手,即可发送验证码.通知类和营销类短信:国内验 ...

  4. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  5. php session存入redis

    一. 安装phpredis扩展 php连接redis需要安装phpredis扩展. 下载地址:https://github.com/phpredis/phpredis/releases,选用相应版本. ...

  6. session存入redis或memcached

    2019独角兽企业重金招聘Python工程师标准>>> session 存入 redis 的 php 配置 安装 redis 安装 phpredis 扩展 编辑 php.ini 配置 ...

  7. Spring Security——集成Spring Session、Redis和JSON序列化解决方案

    官方文档 https://docs.spring.io/spring-session/docs/2.4.2/reference/html5/#spring-security Maven 主要 < ...

  8. 借助Redis完成延时任务

    背景 相信我们或多或少的会遇到类似下面这样的需求: 第三方给了一批数据给我们处理,我们处理好之后就通知他们处理结果. 大概就是下面这个图说的. 本来在处理完数据之后,我们就会马上把处理结果返回给对方, ...

  9. 利用redis保存验证码并设置过期时间

    package com.atguigu.jedis;import redis.clients.jedis.Jedis;import java.util.Random;public class Phon ...

最新文章

  1. python中bin是什么意思_Python之一、#!/usr/bin/python到底是什么意思
  2. OkHttp踩坑记:为何 response.body().string() 只能调用一次?
  3. HTML CSS JS之间的关系
  4. 众核多计算模式系统的构建 - 全文
  5. 【SQL Join】两个字段关联到同一个表,如何使用left join
  6. ServletContext接口
  7. BigDecimal四舍五入与保留位
  8. 程序员的成长从开窍开始系列 一、如何摆脱低级错误的困扰
  9. c语言定义5个元素数组, 对数组进行从小到大排序,定义一个5行5列的二维数组,并动态赋值,将第3列的数组进行从小到大的排序...
  10. MATLAB————用reshape()函数将矩阵转换为张量
  11. 2、开关灯、选项卡、隔行换色
  12. 黑客都怎么制作外挂?C++黑客编程收集的源码集合
  13. 2021 泰迪杯 C 思路
  14. 傻妞机器人对接TG【无需QQ】
  15. envoy中的iptable流量劫持
  16. 如何选购一款适合自己的荧光定量PCR仪?
  17. 180127 逆向-JarvisOJ(BrokenDriver)(静态分析解法)
  18. Flex ANE介绍
  19. Pyecharts概览
  20. 点计算机管理 显示文件缺失,电脑开机显示文件丢失怎么回事

热门文章

  1. oracle默认导出路径linux,传统路径导出 VS 直接路径导出(oracle exp direct=y)
  2. antd autoplay按f12才会轮播_涨知识了!原来这才是电脑键盘上,F1到F12的正确用法...
  3. nacos 开启权限验证后 报错状态 403
  4. 企业微信_客户联系,获取客户及客户群列表及详情
  5. docker nacos mysql nginx 集群多台
  6. Linux7/Redhat7/Centos7 安装Oracle 12C_配置IP、系统参数_02
  7. (Docker实战) 第三篇:配置_开发环境
  8. SpringBoot入门到精通_第3篇 _应用组件分析
  9. Android10弹出截屏对话框,Android一个美丽而聪明的警告对话框SweetAlert
  10. Android 上滑背景变淡,在Android中,如何平滑地将背景从一种颜色淡化到另一种颜色? (如何使用线程)...