zoukankan      html  css  js  c++  java
  • 不使用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")
        @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);
  • 相关阅读:
    委托经典--由浅入深讲解
    原生的AJAX
    asp.net传值
    flex做的圣杯布局
    弹性盒布局实例
    CSS3实现的几个小loading效果
    requireJS基本概念及使用流程(2)
    require.js的基本概念及使用流程(1)
    JSz中的静态方法和实例方法的分析
    前端性能优化的方法
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/5490899.html
Copyright © 2011-2022 走看看