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

来源:互联网 发布:纯音乐听歌写谱软件 编辑:程序博客网 时间:2024/05/14 09:25

为什么要验证码

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 />

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

0 0