不使用session,借助redis实现验证码
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实现验证码相关推荐
- SpringSecurity OAuth2实现单点登录,微信扫码登录,Redis缓存验证码---入门到实战
1. 认证授权 1.1 什么是认证授权 例如课程发布后用户通过在线学习页面点播视频进行学习.如何去记录学生的学习过程呢?要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么时间学习什 ...
- 整合rabbitmq+redis发送验证码消息
文章目录 配置: 验证码工具类 处理发送验证码的消息 controller层 验证验证码是否正确 配置: server:port: 8084 #邮件相关配置 spring:application:na ...
- vue+springboot+阿里云短信服务(集成redis实现验证码登录业务)
阿里云短信服务-介绍 阿里云短信服务(Short Message Service)是广大企业客户快速触达手机用户所优选使用的通信能力.调用API或用群发助手,即可发送验证码.通知类和营销类短信:国内验 ...
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
- php session存入redis
一. 安装phpredis扩展 php连接redis需要安装phpredis扩展. 下载地址:https://github.com/phpredis/phpredis/releases,选用相应版本. ...
- session存入redis或memcached
2019独角兽企业重金招聘Python工程师标准>>> session 存入 redis 的 php 配置 安装 redis 安装 phpredis 扩展 编辑 php.ini 配置 ...
- Spring Security——集成Spring Session、Redis和JSON序列化解决方案
官方文档 https://docs.spring.io/spring-session/docs/2.4.2/reference/html5/#spring-security Maven 主要 < ...
- 借助Redis完成延时任务
背景 相信我们或多或少的会遇到类似下面这样的需求: 第三方给了一批数据给我们处理,我们处理好之后就通知他们处理结果. 大概就是下面这个图说的. 本来在处理完数据之后,我们就会马上把处理结果返回给对方, ...
- 利用redis保存验证码并设置过期时间
package com.atguigu.jedis;import redis.clients.jedis.Jedis;import java.util.Random;public class Phon ...
最新文章
- python中bin是什么意思_Python之一、#!/usr/bin/python到底是什么意思
- OkHttp踩坑记:为何 response.body().string() 只能调用一次?
- HTML CSS JS之间的关系
- 众核多计算模式系统的构建 - 全文
- 【SQL Join】两个字段关联到同一个表,如何使用left join
- ServletContext接口
- BigDecimal四舍五入与保留位
- 程序员的成长从开窍开始系列 一、如何摆脱低级错误的困扰
- c语言定义5个元素数组, 对数组进行从小到大排序,定义一个5行5列的二维数组,并动态赋值,将第3列的数组进行从小到大的排序...
- MATLAB————用reshape()函数将矩阵转换为张量
- 2、开关灯、选项卡、隔行换色
- 黑客都怎么制作外挂?C++黑客编程收集的源码集合
- 2021 泰迪杯 C 思路
- 傻妞机器人对接TG【无需QQ】
- envoy中的iptable流量劫持
- 如何选购一款适合自己的荧光定量PCR仪?
- 180127 逆向-JarvisOJ(BrokenDriver)(静态分析解法)
- Flex ANE介绍
- Pyecharts概览
- 点计算机管理 显示文件缺失,电脑开机显示文件丢失怎么回事
热门文章
- oracle默认导出路径linux,传统路径导出 VS 直接路径导出(oracle exp direct=y)
- antd autoplay按f12才会轮播_涨知识了!原来这才是电脑键盘上,F1到F12的正确用法...
- nacos 开启权限验证后 报错状态 403
- 企业微信_客户联系,获取客户及客户群列表及详情
- docker nacos mysql nginx 集群多台
- Linux7/Redhat7/Centos7 安装Oracle 12C_配置IP、系统参数_02
- (Docker实战) 第三篇:配置_开发环境
- SpringBoot入门到精通_第3篇 _应用组件分析
- Android10弹出截屏对话框,Android一个美丽而聪明的警告对话框SweetAlert
- Android 上滑背景变淡,在Android中,如何平滑地将背景从一种颜色淡化到另一种颜色? (如何使用线程)...