zoukankan      html  css  js  c++  java
  • jsp 验证码

    需要注意在resin下应该使用第二种方式:

    <%@page import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*, sun.misc.BASE64Encoder, java.awt.image.DataBufferByte, java.io.*,javax.swing.ImageIcon"%>
    
    //tomcat下 
    <%@ page contentType="image/jpg"  language="java"%>
    
    //resin下
    <%@ page contentType="text/html"  language="java"%>
    
    <%!
    Color getRandColor(int fc,int bc) {//给定范围获得随机颜色
        Random random = new Random();
        if(fc>255) fc=255;
        if(bc>255) bc=255;
        int r=fc+random.nextInt(bc-fc);
        int g=fc+random.nextInt(bc-fc);
        int b=fc+random.nextInt(bc-fc);
        return new Color(r,g,b);
    }
    %>
    <%
    out.clear();
    
    //设置页面不缓存
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);
    
    
    // 在内存中创建图象
    int width=60, height=30;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    
    // 获取图形上下文
    Graphics g = image.getGraphics();
    
    //生成随机类
    Random random = new Random();
    
    // 设定背景色
    g.setColor(getRandColor(200,250)); 
    g.fillRect(0, 0, width, height);
    
    //设定字体
    g.setFont(new Font("Times New Roman",Font.PLAIN, 32));
    
    //画边框
    //g.setColor(new Color());
    //g.drawRect(0,0,width-1,height-1);
    
    
    // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
    g.setColor(getRandColor(160,200));
    for (int i=0;i<155;i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x,y,x+xl,y+yl);
    }
    
    // 取随机产生的认证码(4位数字)
    /*
    for(int i=0; i < sRand.length(); i++) {
        String rand=String.valueOf(sRand.charAt(i));
        // 将认证码显示到图象中
        g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
        g.drawString(rand, 13*i + 6, 16);
    }
    */
    
    String sRand = "";
    for (int i=0;i<4;i++){
        String rand=String.valueOf(random.nextInt(10));
        sRand+=rand;
        // 将认证码显示到图象中
        g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
        g.drawString(rand, 13*i+2, 24);
    }
    
    
    // 将认证码存入SESSION
    session.setAttribute("validateCode", sRand);
    
    // 图象生效
    g.dispose();
    
    // tomcat下使用下方法输出图象到页面
    //ImageIO.write(image, "JPG", response.getOutputStream());
    
    //resin 下base64解决办法
    ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); 
    try {
        ImageIO.write(image, "JPEG", byteOut);
        
        byte[] data = byteOut.toByteArray(); 
        
        BASE64Encoder encoder = new BASE64Encoder();
        out.write(encoder.encode(data));
    
        out.flush();
        out.clear();
    } catch (IOException e) { 
        e.printStackTrace();
    }
    
    %>

    验证码刷新:

    //tomcat下验证验证码刷新  _date 参数防止浏览器缓存
    <img src="http://127.0.0.1:8081/mobilechat/validate.jsp" onclick="this.src='http://127.0.0.1:8081/mobilechat/validate.jsp?_date=' + new Date().getTime();"></img><br />
    
    //而resin下验证码刷新 绝不可能写成这样,
    <img src="data:image/png;base64,<jsp:include page="validate1.jsp" flush="true"/>" onclick="this.src='data:image/png;base64,<jsp:include page="validate1.jsp" flush="true"/>'"></img>
    
    //如果仅仅是显示, 但是刷新只能采用ajax操作了。
    <img src="data:image/png;base64,<jsp:include page="validate1.jsp" flush="true"/>" />
  • 相关阅读:
    使用Netty4实现基本的消息分发
    【Netty官方文档翻译】引用计数对象(reference counted objects)
    nio复习总结
    redis tutorail
    服装设计
    linux nat网络配置
    关闭linux退格键和vi发出的嘟嘟声
    CentOS/Linux 网卡设置 IP地址配置
    WCF Security基本概念(转载)
    WCF使用net.tcp寄宿到IIS中(转)
  • 原文地址:https://www.cnblogs.com/hzm112567/p/3791428.html
Copyright © 2011-2022 走看看