zoukankan      html  css  js  c++  java
  • web开发(十) struts2之图片验证码

    1、配置前端页面

    1 <!-- 验证码-->
    2           <div class="form-group " style="padding-left: 9%;" id="show"> 
    3                   <span class="glyphicon glyphicon-picture pull-left input-group" style="padding-top: 8px;"></span>
    4                 <input type="text" class="form-control col-md-7 pull-left" maxlength="4" id="user.user_code" name="user.user_code" placeholder="验证码" style="100px;margin-left: 2%">
    5                   <img  alt="" src="Code.action" src="video/Crocodile.jpg" onclick="this.src='Code.action?'+ Math.random();" class="pull-left" style="65px;height: 35px;margin-left: 2%;"/>
    6                   <small class="control-label pull-left" style="margin-top: 10px;margin-left: 5px;">(点击图片刷新)</small>
    7                   <label class="control-label pull-left" id="msg_code" style="color: red;margin-top: 3px;margin-left: 5px;"></label>
    8           </div>
    login.jsp

    其中  src="Code.action"  onclick="this.src='Code.action?'+ Math.random();",分别为action的name和每次点击图片都自动刷新一次

    2、配置Action

    1 <action name="Code" class="Action.LoginOrRegisterAction" method="getCheckCodePic">
    2                 <result name="success" type="stream"> 
    3                       <param name="contentType">image/jpeg</param>
    4                       <param name="input2">inputStream</param> 
    5                       <param name="bufferSize">2048</param>    
    6                 </result>
    7            </action>
    struts.xml

    3、Action实例

     1  //获取验码图片
     2     public String getCheckCodePic() {
     3           int WIDTH = 60;
     4           int HEIGHT = 20;
     5          HttpServletResponse response = ServletActionContext.getResponse();
     6    
     7          // 设置浏览器不要缓存此图片
     8          response.setHeader("Pragma", "no-cache");
     9    
    10          response.setHeader("Cache-Control", "no-cache");
    11    
    12          response.setDateHeader("Expires", 0);
    13    
    14          String str = "0123456789qwertyuiopasdfghjklzxcvbnm";
    15    
    16          char[] rand = new char[4];
    17    
    18          Random random = new Random();
    19    
    20          for (int i = 0; i < 4; i++)
    21          {
    22              rand[i] = str.charAt(random.nextInt(36));
    23          }
    24    
    25          String rands =new String(rand);
    26    
    27          BufferedImage image = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
    28    
    29          Graphics g = image.getGraphics();
    30    
    31          // 产生图像
    32          // 画背景
    33          g.setColor(new Color(0xDCDCDC));
    34    
    35          g.fillRect(0, 0, WIDTH, HEIGHT);
    36    
    37          // 随机产生 120 个干扰点
    38    
    39          for (int i = 0; i < 120; i++)
    40          {
    41              int x = (int) (Math.random() * WIDTH);
    42    
    43              int y = (int) (Math.random() * HEIGHT);
    44    
    45              int red = (int) (Math.random() * 255);
    46    
    47              int green = (int) (Math.random() * 255);
    48    
    49              int blue = (int) (Math.random() * 255);
    50    
    51              g.setColor(new Color(red, green, blue));
    52    
    53              g.drawOval(x, y, 1, 0);
    54          }
    55    
    56          g.setColor(Color.BLACK);
    57    
    58          g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
    59    
    60          // 在不同的高度上输出验证码的每个字符
    61    
    62          g.drawString("" + rands.charAt(0), 1, 17);
    63    
    64          g.drawString("" + rands.charAt(1), 16, 15);
    65    
    66          g.drawString("" + rands.charAt(2), 31, 18);
    67    
    68          g.drawString("" + rands.charAt(3), 46, 16);
    69    
    70          System.out.println(rands);
    71    
    72          // 结束图像 的绘制 过程, 完成图像
    73          g.dispose();
    74    
    75          ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    76    
    77          try {
    78              ImageIO.write(image, "jpeg", outputStream);
    79        
    80              ByteArrayInputStream input = new ByteArrayInputStream(outputStream.toByteArray());
    81        
    82              this.setInputStream(input);
    83              Map<String, Object> session = ActionContext.getContext().getSession();
    84              session.put("checkCode", rands);
    85              input.close();
    86              outputStream.close();
    87          } catch (IOException e) {
    88              // TODO Auto-generated catch block
    89              e.printStackTrace();
    90          }
    91          return SUCCESS;    
    92     } 
    LoginOrRegisterAction

    4、另一个Action(进行表单验证,通过获取之前保存Session的key)

     1 //验证用户码是否正确
     2             Map<String, Object> session1=ActionContext.getContext().getSession();
     3             if(user.getUser_code()!=null && "".equals(user.getUser_code())==false) {
     4                 String code=(String) session1.get("checkCode");
     5                 if(code.equals(user.getUser_code())==false) {
     6                     //验证码错误,返回状态值
     7                     map2.put("LoginStatus", "303");
     8                     System.out.println("验证码错误");
     9                     String ReturnData=JSONObject.toJSONString(map2); //把Map集合封装成Json形式的字符串
    10                     inputStream=new ByteArrayInputStream(ReturnData.getBytes("UTF-8"));
    11                     return SUCCESS;
    12                 }
    13                 
    14             }
    LoginAction
  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/hzb462606/p/8983477.html
Copyright © 2011-2022 走看看