zoukankan      html  css  js  c++  java
  • Java生成验证码图片

    Java生成验证码图片的具体代码,供大家参考,具体内容如下

    1、首先新建一各专门生成验证码图片的类VerifyCode:

    public class VerifyCode {


    private int w=70;
    private int h=35;
    private Random r=new Random();
    //宋体,华文楷书,黑体,华文新魏,华文隶书,微软雅黑,楷体_GB2312,Times New Roman
    private String [] fontNames={"宋体","华文楷书","黑体","华文新魏","微软雅黑","华文隶书","楷体_GB2312","Times New Roman"};
    //可选的字符
    private String codes="23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
    //背景色
    private Color bgColor=new Color(255,255,255);
    //验证码上的文本
    private String text;

    //生成随机颜色
    private Color randomColor(){
    int red=r.nextInt(150);
    int green=r.nextInt(150);
    int blue=r.nextInt(150);
    return new Color(red,green,blue);
    }

    //生成随机字体
    private Font randomFont(){
    int index=r.nextInt(fontNames.length);//获取下标
    String fontName=fontNames[index];//生成随机的字体名称
    int style=r.nextInt(4);//获取随机样式,0表示无样式,1表示粗体,2表示斜体,3表示粗体加斜体
    int size=r.nextInt(5)+24;//生成随机字号,24~28
    return new Font(fontName,style,size);
    }

    //画干扰线
    private void drawLine(BufferedImage image){
    int num=3;//一共画3条
    Graphics2D g2=(Graphics2D) image.getGraphics();
    for(int i=0;i<num;i++){//随机生成坐标,即4个值
    int x1=r.nextInt(w);
    int y1=r.nextInt(h);
    int x2=r.nextInt(w);
    int y2=r.nextInt(h);
    g2.setStroke(new BasicStroke(1.5F));//设置笔画的宽度
    g2.setColor(Color.blue);//干扰线颜色
    g2.drawLine(x1, y1, x2, y2);//画线
    }
    }

    //随机生成一个字符
    private char randomChar(){
    int index=r.nextInt(codes.length());
    return codes.charAt(index);
    }

    //创建BufferedImage
    private BufferedImage createImage(){
    BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
    Graphics2D g2=(Graphics2D) image.getGraphics();
    g2.setColor(this.bgColor);
    g2.fillRect(0, 0, w, h);
    return image;
    }

    //外界调用这个方法得到验证码
    public BufferedImage getImage(){
    BufferedImage image=createImage();//创建图片缓冲区
    Graphics2D g2=(Graphics2D)image.getGraphics();//得到绘制环境
    StringBuilder sb=new StringBuilder();//用来装载生成的验证码文本
    //向图中画4个字符
    for(int i=0;i<4;i++){//循环4次
    String s=randomChar()+"";//随机生成一个字符
    sb.append(s);//把字母添加到sb中
    double x=i*1.0*w/4;//设置当前字符的x轴坐标
    g2.setFont(randomFont());//设置随机字体
    g2.setColor(randomColor());//设置随机颜色
    g2.drawString(s, (int)x, h-5);
    }
    this.text=sb.toString();//把生成的字符串赋给了this.text
    drawLine(image);//添加干扰线
    return image;
    }

    //返回验证码图片上面的文本
    public String getText(){
    return text;
    }

    //保存图片到指定的输出流
    public static void output(BufferedImage image,OutputStream out) throws IOException{
    ImageIO.write(image, "JPEG", out);
    }
    }

    2、在jsp页面上应用:

    其核心代码如下:

    <form action="/test/LoginServlet" method="post">
    用户名:<input type="text" name="username" value="<%=uname %>"><br>
    密 码:<input type="password" name="password"><br>
    验证码:<input type="text" name="verifyCode">
    <img id="img" src="/test/VerifyCodeServlet">
    <a href="JavaScript:_change()" rel="external nofollow" >看不清换一张</a><br>
    <input type="submit" value="登录">
    </form>


    看不清换一张使用javascript实现,代码如下:

    <script type="text/javascript">
    function _change(){
    /**
    *1.得到image图片
    *2.修改其src为/test/VerifyCodeServlet
    */
    var imgEle=document.getElementById("img");
    imgEle.src="/test/VerifyCodeServlet?a="+new Date().getTime();

    }
    </script>

    +new Date().getTime()这条语句可以欺骗浏览器,以为请求是新的,实现验证码的改变。

    3、在第2步中,VerifyCodeServlet的实现生成一张验证码,并且通过session域保存验证码图片对应的文本内容,为后面的登录验证验证码是否正确做准备。核心代码如下:

    public class VerifyCodeServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {


    /*
    * 1.生成图片
    * 2.保存图片上的文本到session域中
    * 3.把图片响应给客户端
    */
    VerifyCode vc=new VerifyCode();
    BufferedImage image=vc.getImage();
    //保存图片上的文本到session域
    request.getSession().setAttribute("session_code", vc.getText());

    VerifyCode.output(image, response.getOutputStream());

    }
    }

    4、最后一步,实现登录验证验证码是否正确,其核心代码如下:

    public class LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {


    /*
    * 校验验证码
    * 1.从session中获取正取的验证码
    * 2.从表单中获取用户填写的验证码
    * 3.进行比较
    * 4.如果相同,向下运行,否则保存错误信息到request域,转发到login.jsp
    */
    String sessionCode=(String)

    request.getSession().getAttribute("session_code");//获得的验证码里面对应的文本内容
    String paramCode=request.getParameter("verifyCode");//用户输入文本框里面的内容
    if(!paramCode.equalsIgnoreCase(sessionCode)){
    request.setAttribute("msg", "验证码错误!");
    request.getRequestDispatcher("/login.jsp").forward(request, response);//打回到登录界面。
    return;//返回,不继续执行下面的语句。
    }
    }
    }


    以上就是本文的全部内容,希望对大家的学习有所帮助

    本篇文章来源于源码库(www.aspku.com),转载请注明出处 原文链接:http://www.aspku.com/kaifa/java/237240.html

    =========================================================================================

    Java生成验证码图片的具体代码,供大家参考,具体内容如下

    1、首先新建一各专门生成验证码图片的类VerifyCode:

    public class VerifyCode {


    private int w=70;
    private int h=35;
    private Random r=new Random();
    //宋体,华文楷书,黑体,华文新魏,华文隶书,微软雅黑,楷体_GB2312,Times New Roman
    private String [] fontNames={"宋体","华文楷书","黑体","华文新魏","微软雅黑","华文隶书","楷体_GB2312","Times New Roman"};
    //可选的字符
    private String codes="23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
    //背景色
    private Color bgColor=new Color(255,255,255);
    //验证码上的文本
    private String text;

    //生成随机颜色
    private Color randomColor(){
    int red=r.nextInt(150);
    int green=r.nextInt(150);
    int blue=r.nextInt(150);
    return new Color(red,green,blue);
    }

    //生成随机字体
    private Font randomFont(){
    int index=r.nextInt(fontNames.length);//获取下标
    String fontName=fontNames[index];//生成随机的字体名称
    int style=r.nextInt(4);//获取随机样式,0表示无样式,1表示粗体,2表示斜体,3表示粗体加斜体
    int size=r.nextInt(5)+24;//生成随机字号,24~28
    return new Font(fontName,style,size);
    }

    //画干扰线
    private void drawLine(BufferedImage image){
    int num=3;//一共画3条
    Graphics2D g2=(Graphics2D) image.getGraphics();
    for(int i=0;i<num;i++){//随机生成坐标,即4个值
    int x1=r.nextInt(w);
    int y1=r.nextInt(h);
    int x2=r.nextInt(w);
    int y2=r.nextInt(h);
    g2.setStroke(new BasicStroke(1.5F));//设置笔画的宽度
    g2.setColor(Color.blue);//干扰线颜色
    g2.drawLine(x1, y1, x2, y2);//画线
    }
    }

    //随机生成一个字符
    private char randomChar(){
    int index=r.nextInt(codes.length());
    return codes.charAt(index);
    }

    //创建BufferedImage
    private BufferedImage createImage(){
    BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
    Graphics2D g2=(Graphics2D) image.getGraphics();
    g2.setColor(this.bgColor);
    g2.fillRect(0, 0, w, h);
    return image;
    }

    //外界调用这个方法得到验证码
    public BufferedImage getImage(){
    BufferedImage image=createImage();//创建图片缓冲区
    Graphics2D g2=(Graphics2D)image.getGraphics();//得到绘制环境
    StringBuilder sb=new StringBuilder();//用来装载生成的验证码文本
    //向图中画4个字符
    for(int i=0;i<4;i++){//循环4次
    String s=randomChar()+"";//随机生成一个字符
    sb.append(s);//把字母添加到sb中
    double x=i*1.0*w/4;//设置当前字符的x轴坐标
    g2.setFont(randomFont());//设置随机字体
    g2.setColor(randomColor());//设置随机颜色
    g2.drawString(s, (int)x, h-5);
    }
    this.text=sb.toString();//把生成的字符串赋给了this.text
    drawLine(image);//添加干扰线
    return image;
    }

    //返回验证码图片上面的文本
    public String getText(){
    return text;
    }

    //保存图片到指定的输出流
    public static void output(BufferedImage image,OutputStream out) throws IOException{
    ImageIO.write(image, "JPEG", out);
    }
    }

    2、在jsp页面上应用:

    其核心代码如下:

    <form action="/test/LoginServlet" method="post">
    用户名:<input type="text" name="username" value="<%=uname %>"><br>
    密 码:<input type="password" name="password"><br>
    验证码:<input type="text" name="verifyCode">
    <img id="img" src="/test/VerifyCodeServlet">
    <a href="JavaScript:_change()" rel="external nofollow" >看不清换一张</a><br>
    <input type="submit" value="登录">
    </form>


    看不清换一张使用javascript实现,代码如下:

    <script type="text/javascript">
    function _change(){
    /**
    *1.得到image图片
    *2.修改其src为/test/VerifyCodeServlet
    */
    var imgEle=document.getElementById("img");
    imgEle.src="/test/VerifyCodeServlet?a="+new Date().getTime();

    }
    </script>

    +new Date().getTime()这条语句可以欺骗浏览器,以为请求是新的,实现验证码的改变。

    3、在第2步中,VerifyCodeServlet的实现生成一张验证码,并且通过session域保存验证码图片对应的文本内容,为后面的登录验证验证码
    是否正确做准备。核心代码如下:

    public class VerifyCodeServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {


    /*
    * 1.生成图片
    * 2.保存图片上的文本到session域中
    * 3.把图片响应给客户端
    */
    VerifyCode vc=new VerifyCode();
    BufferedImage image=vc.getImage();
    //保存图片上的文本到session域
    request.getSession().setAttribute("session_code", vc.getText());

    VerifyCode.output(image, response.getOutputStream());

    }
    }

    4、最后一步,实现登录验证验证码是否正确,其核心代码如下:

    public class LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {


    /*
    * 校验验证码
    * 1.从session中获取正取的验证码
    * 2.从表单中获取用户填写的验证码
    * 3.进行比较
    * 4.如果相同,向下运行,否则保存错误信息到request域,转发到login.jsp
    */
    String sessionCode=(String)

    request.getSession().getAttribute("session_code");//获得的验证码里面对应的文本内容
    String paramCode=request.getParameter("verifyCode");//用户输入文本框里面的内容
    if(!paramCode.equalsIgnoreCase(sessionCode)){
    request.setAttribute("msg", "验证码错误!");
    request.getRequestDispatcher("/login.jsp").forward(request, response);//打回到登录界面。
    return;//返回,不继续执行下面的语句。
    }
    }
    }


    以上就是本文的全部内容,希望对大家的学习有所帮助。。。

  • 相关阅读:
    回调函数实例
    Java StringBuffer 和 StringBuilder 类
    excel被保护或者锁定时候按住alt和enter可以输入换行
    ArrayUtils.
    excel中在某一列上的所有单元格的前后增加
    decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
    正则表达式:Pattern类与Matcher类详解
    Cocos2d-x文本菜单
    msp430在ccsv5下出现的问题总结
    与TCP/IP协议的初次见面(一)
  • 原文地址:https://www.cnblogs.com/tengqiuyu/p/7443384.html
Copyright © 2011-2022 走看看