博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不使用session,借助redis实现验证码
阅读量:7255 次
发布时间:2019-06-29

本文共 3197 字,大约阅读时间需要 10 分钟。

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

2.看一下代码

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

     

    windows 下的 redis下载

    

  获取验证码的tooken

   @RequestMapping(value="loginCode")    @ResponseBody    public 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);

 

转载地址:http://knkdm.baihongyu.com/

你可能感兴趣的文章
7道常见的数据分析面试题
查看>>
管理微服务中的数据
查看>>
Oracle将NetBeans交给了Apache基金会
查看>>
新JEP将简化Java类型变异
查看>>
象SaaS一样用亚马逊Kinesis Analytics做大数据分析
查看>>
TSC的分歧导致Node.js分支
查看>>
作者问答:解密硅谷
查看>>
苹果如何使用神经网络在点云中做对象检测
查看>>
比特币寒冬中,你更应该关注企业区块链!
查看>>
都说AIOps是必然趋势,那实践AIOps之前需要做些什么准备?\n
查看>>
Python数据分析学习笔记之Pandas入门
查看>>
我写的第一本书《TypeScript 入门教程》
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
Bitbucket Pipelines在Atlassian的Bitbucket云上提供持续交付功能
查看>>
发布至今18年,为什么SQLite一定要用C语言来开发?
查看>>
SSL certificate problem: unable to get local issuer certificate
查看>>
【node测试系列】几款前端测试断言库(Assertions lib)的选型总结
查看>>
组件化的css-module
查看>>
Redux 莞式教程 之 简明篇
查看>>
用vue+webpack搭建的前端项目结构
查看>>