您的位置:首页 > 其它

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

2015-05-28 10:12 399 查看

为什么要验证码

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=''/验证码servlet的URL />


还有一点要注意的是:对于验证码的验证应该放在用户名和密码验证之前验证,这样有利于减轻对数据库访问的负担。(费资源的两个操作:网络和数据库)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: