首页 技术 正文
技术 2022年11月8日
0 收藏 551 点赞 1,264 浏览 29789 个字

Kaptcha验证码 是google提供的验证码插件,使用起来相对简单,设置的干扰线以及字体扭曲不易让其他人读取破解。

这里我们需要 导入一个 kaptcha-2.3.jar 
下载地址:http://pan.baidu.com/s/1dDzw7Bj

jar包中有个 KaptchaServlet 的servlet,每次访问都会保存在session 作用域当中

默认保存的名称是 KAPTCHA_SESSION_KEY 你也可以自己设定 保存过名称

看xml中的注释的   “session中存放验证码的key键” 配置,同时你也可以根据个人的需求去设置其他验证码的参数属性

//web.xml 配置

<servlet>
      <servlet-name>kaptcha</servlet-name>
      <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>

<!– <init-param>
            <description>图片边框,合法值:yes , no</description>
            <param-name>kaptcha.border</param-name>
            <param-value>yes</param-value>
        </init-param>
        <init-param>
            <description>
                边框颜色,合法值: r,g,b (and optional alpha) 或者
                white,black,blue.
            </description>
            <param-name>kaptcha.border.color</param-name>
            <param-value>black</param-value>
        </init-param>
        <init-param>
            <description>边框厚度,合法值:>0</description>
            <param-name>kaptcha.border.thickness</param-name>
            <param-value>1</param-value>
        </init-param>
        <init-param>
            <description>图片宽 200</description>
            <param-name>kaptcha.image.width</param-name>
            <param-value>200</param-value>
        </init-param>
        <init-param>
            <description>图片高 50</description>
            <param-name>kaptcha.image.height</param-name>
            <param-value>50</param-value>
        </init-param>
        <init-param>
            <description>图片实现类</description>
            <param-name>kaptcha.producer.impl</param-name>
            <param-value>
                com.google.code.kaptcha.impl.DefaultKaptcha
            </param-value>
        </init-param>
        <init-param>
            <description>文本实现类</description>
            <param-name>kaptcha.textproducer.impl</param-name>
             <param-value>
                com.google.code.kaptcha.text.impl.DefaultTextCreator
            </param-value>
        </init-param>
        <init-param>
            <description>文本集合,验证码值从此集合中获取</description>
            <param-name>kaptcha.textproducer.char.string</param-name>
            <param-value>QWERTYUIOPASDFGHJKLZXCVBNM1234567890</param-value>
        </init-param>
        <init-param>
            <description>验证码长度 5</description>
            <param-name>kaptcha.textproducer.char.length</param-name>
            <param-value>5</param-value>
        </init-param>
        <init-param>
            <description>字体 Arial, Courier</description>
            <param-name>kaptcha.textproducer.font.names</param-name>
            <param-value>Arial, Courier</param-value>
        </init-param>
        <init-param>
            <description>字体大小 40px.</description>
            <param-name>kaptcha.textproducer.font.size</param-name>
            <param-value>40</param-value>
        </init-param>
        <init-param>
            <description>
                字体颜色,合法值: r,g,b 或者 white,black,blue.
            </description>
            <param-name>kaptcha.textproducer.font.color</param-name>
            <param-value>black</param-value>
        </init-param>
        <init-param>
            <description>文字间隔 2</description>
            <param-name>kaptcha.textproducer.char.space</param-name>
            <param-value>2</param-value>
        </init-param>
        <init-param>
            <description>干扰实现类</description>
            <param-name>kaptcha.noise.impl</param-name>
            <param-value>
                <!– com.google.code.kaptcha.impl.NoNoise –>
                com.google.code.kaptcha.impl.DefaultNoise
            </param-value>
        </init-param>
        <init-param>
            <description>
                干扰颜色,合法值: r,g,b 或者 white,black,blue.
            </description>
            <param-name>kaptcha.noise.color</param-name>
            <param-value>black</param-value>
        </init-param>
        <init-param>
            <description>
                图片样式: 水纹com.google.code.kaptcha.impl.WaterRipple
                鱼眼com.google.code.kaptcha.impl.FishEyeGimpy
                阴影com.google.code.kaptcha.impl.ShadowGimpy
            </description>
            <param-name>kaptcha.obscurificator.impl</param-name>
            <param-value>
                com.google.code.kaptcha.impl.WaterRipple
            </param-value>
        </init-param>
        <init-param>
            <description>背景实现类</description>
            <param-name>kaptcha.background.impl</param-name>
            <param-value>
                com.google.code.kaptcha.impl.DefaultBackground
            </param-value>
        </init-param>
        <init-param>
            <description>背景颜色渐变,开始颜色</description>
            <param-name>kaptcha.background.clear.from</param-name>
            <param-value>green</param-value>
        </init-param>
        <init-param>
            <description>背景颜色渐变,结束颜色</description>
            <param-name>kaptcha.background.clear.to</param-name>
            <param-value>white</param-value>
        </init-param>
        <init-param>
            <description>文字渲染器</description>
            <param-name>kaptcha.word.impl</param-name>
            <param-value>
                com.google.code.kaptcha.text.impl.DefaultWordRenderer
            </param-value>
        </init-param>
        <init-param>
            <description>
                session中存放验证码的key键
            </description>
            <param-name>kaptcha.session.key</param-name>
            <param-value>KAPTCHA_SESSION_KEY</param-value>
        </init-param>
        <init-param>
            <description>
                The date the kaptcha is generated is put into the
                HttpSession. This is the key value for that item in the
                session.
            </description>
            <param-name>kaptcha.session.date</param-name>
            <param-value>KAPTCHA_SESSION_DATE</param-value>
        </init-param>–>
  </servlet>

<servlet-mapping>
     <servlet-name>kaptcha</servlet-name>
     <url-pattern>/randomcode.jpg</url-pattern>
  </servlet-mapping>

<servlet>
      <servlet-name>loginServlet</servlet-name>
      <servlet-class>com.test.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>loginServlet</servlet-name>
     <url-pattern>/login.do</url-pattern>
  </servlet-mapping>

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

//index.jsp 代码

<form action=”<%=request.getContextPath()%>/login.do” method=”get” >
  <center>
   <div>
           验证码:<input type=”text” name=”code2″ />
  <img alt=”验证码” src=”<%=request.getContextPath()%>/randomcode.jpg” id=”code2″ onclick=”relodCode(this,’randomcode.jpg’)”/>
  </div>
  <input type=”submit” value=”提交”/>
  </center>
  </form>
<script type=”text/javascript”>
    function relodCode(obj,url){
        var time=new Date();
        obj.src=”<%=request.getContextPath()%>/”+url+”?time=”+time;
    }
</script>

//提交验证 servlet

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        //获取 kaptchaServlet 保存生成的验证码
        String code=(String)req.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
        
        String code2=req.getParameter(“code2”);
        System.out.println(“code=”+code);
        System.out.println();
        PrintWriter out=null;
        String msg=”输入有误!”;
        try {
            resp.setContentType(“text/html;charset=utf-8”);
            out=resp.getWriter();
            if(code2.equals(code)){
                msg=”输入正确!”;
            }
           out.print(msg+”\tcode=”+code+”\tcode2=”+code2);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(null!=out) out.close();
        }
        super.doGet(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

//效果图(点击验证码刷新)

<img src="data:image/png;base64,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" alt="" />

    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWYAAAAyCAIAAADgLOYUAAAFHElEQVR4nO2czZHjOAxGlREjYkBKZU4MYHLYi/LxHqwfggRAQW61vd73yjVVlkQKAoFPINw105+///Dhw4fPyc/0AAA4DZIBAAGQDAAIgGQAQAAkAwACIBkAEADJAIAASAYABEAyACAAkgEAAZAMAAiAZABAgIFkLHOacukOlzxNU5qXm4yKsMzpvZaUPE2aj+5mmdOnrME1PvIBPtKoz8KXDFUx1oMl24lyKo9Lnk6S5qW/PJf1Rsrh+g53Z/P3ScbT07fnTeQBxOLf6ezbvLpG6hsC5acxJaNL6PVhS948alQgj8fjsSxlTpf8U/JgxWqlOmzZ7JFDkYwLlDzlPFqFn+D0A8iX073+vsmry5xSztdS4tNwqwyZkv0Bv5go+YKHRpJxhE8zvSZgv7Jp+S7JKHlKc/mV6vzqA9y6d7hl8mdsvitQfhpPMpSXeGr2ASlnJytPiEYrEb5kHLpQ8rYIGutNh5JR7WvEdXK/oynRMaqLhNqqi3WWMbw6lUsf3MrI9qK2CdW4e13xE3ljeU4sSTeF/wC11527X8lqb+q4Uc2SPy9pvsuvubzv3fLTOJLxjJ/nv17ymefO7IlDklEv37oI67WVulU65UpGs9DLPJfK7GNpmyyTXzeL6r3S8S0eJPbwxtw1zhu7+pEyfNsNtXTQ7rlBUlqea4Z1l7kPIAa7BoS96kx90SgZpW2cizfl4eLvl4w1C/dkrN8fTfGh+6Hkacqz3fDYLzorGbvPK92+KhlmUCoLWx3qh4mgaweLhO1bta0zneG9WUK77JH1mb1Q1PzT+M19Q2gnleP1If8BusFmHLRXDr3qTX3VKHGm5GlKKWkBKDz89ZLRLEWa53ykzVq9bkWs5oc9aLuGiECTjJYqaTrJ0BlLhhWS6rrqodKP0CPwdA3tDFfMGudj90bcGxXVsErs7CxTnSFRx+jK1Y8wlLiPq3jaeVNfN6oy72hUHN9rzdEL0P8wwz/lqquMgGRUgeX8shKoMkp+RnslGYsI/lCVYUSkcX9R3qgNBqFqhoANcYYrZnWS4Wntpjvbiu061IV5O/VZz6nHj4n8BzBKBU2co61Jb+oXjNoft359bd97Rd7N/79JhnCbJxlN/Dht0HAvIyIZNpF9SazKGLUAnMRwhp+oMuwbrx5ZF0y4z5U6NcID+5LgC91fNEsvRl71pn7FqC349jdpu5G3DPuF36Lu5YxkPIMnn64yFF+bu5NXJCMS6dpUkV6Gv/lVy/s49nCrhyL2057bjhLtUXWZoo0e76TVy/CbQGoJHzNogDP1S0Y9hbiIP1NK8+y/Hb+6yqjyMVZlGJ4xXv5hyThUob5UrzLcRRK53vb9mxKp7fuLwqCeRhkc7u3rw6W5mydk+8G68db2rLfVdcNONcOvWjTPNYVAM8vgAfrBok54Jdfsqa8b9djbnmIJhJc1M75ZMjbMXsaKlAwv2Mw2QbjK2O8kckBXD2+RagkSNxX1i1ptH+VMexNRkMYjxBkuVbxztTOyyzq/LTB+qVuek9W4tsFzHqB9KfVHLztWn/q6UceptgXklyVIxkOk8dgnxxX2Tk9FlRqZAmn9q6rvWBeADyUoGUX+0lll6Nlt/CvbUgB4N/x/GQAQAMkAgABIBgAEQDIAIACSAQABkAwACIBkAEAAJAMAAiAZABAAyQCAAEgGAARAMgAgAJIBAAGQDAAIgGQAQAAkAwACIBkAEADJAIAASAYABEAyACAAkgEAAZAMAAjwLx6ieDq9yqmrAAAAAElFTkSuQmCC" alt="" />

上一篇: ImageLoader
下一篇: HDU1426 DFS
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,497
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,910
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,744
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,497
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,135
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,298