Servlet自学第24讲:Session应用—验证码功能的实现

为什么要验证码

http请求的底层机制是公开的,某些人可以模拟一个简单的tomcat或者ie不停地向服务器发送请求,造成恶意访问;有的甚至可以通过这种无休止的访问破解用户账号和密码。采用验证码功能在一定程度上能解决这个问题。
(推荐一个网站:www.sourceforge.net开源之祖)

实现原理

使用到了java的绘图技术,采用servlet生成验证码

public class CreateCode extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        int width=80;
        int height=20;
        //禁止浏览器缓存图片(缓存的话不能做到实时更新)
        response.setDateHeader("Expires", -1);
        response.setHeader("cache-Control", "no-cache");
        response.setHeader("Pragma","no-cache");
        //通知客户端以图片的方式打开发送过去的数据
        response.setHeader("Content-Type", "image/jpeg");
        //在内存中创建一副图片
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
        //向图片中写数据
        Graphics g = image.getGraphics();
        //设置背景色
        g.setColor(Color.red);
        g.fillRect(0, 0, width, height);

        //设置写入的数据颜色和字体
        g.setColor(Color.black);
        g.setFont(new Font(null,Font.BOLD,20));
        //向图片上写数据
        String str =getNum();
        //把随机数生成的数值保存到session
        request.getSession().setAttribute("checkcode", str);
        g.drawString(str, 2, 18);

        //把写好的数据输出给浏览器
        ImageIO.write(image, "jpg", response.getOutputStream());
    }
     //随机生成数字     
    private String getNum(){
        String str = null;
        Random r = new Random();
        //生成7位
        String num = r.nextInt(9999999)+"";
        //如果不够7位,就前面补零
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<7-num.length();i++){
            sb.append("0");
        }
        str =sb.toString()+ num;
        return str;
    } 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

(访问服务器的image时会向服务器请求两次,第一次是定位资源,然后再请求一次加载图片,其实图片就是一个文件)
使用该“图片验证码”的方式为:

< img src=''/验证码servletURL />

还有一点要注意的是:对于验证码的验证应该放在用户名和密码验证之前验证,这样有利于减轻对数据库访问的负担。(费资源的两个操作:网络和数据库)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值