案例:图片验证码

图片验证码

1验证码有啥用

在我们注册时,如果没有验证码的话,我们可以使用URLConnection来写一段代码发出注册请求。甚至可以使用while(true)来注册!那么服务器就废了!
验证码可以去识别发出请求的是人还是程序!当然,如果聪明的程序可以去分析验证码图片!但分析图片也不是一件容易的事,因为一般验证码图片都会带有干扰线,人都看不清,那么程序一定分析不出来。

2 VerifyCode类

现在我们已经有了cn.itcast.utils.VerifyCode类,这个类可以生成验证码图片!下面来看一个小例子。

public void fun1()throws IOException{
//创建验证码类
VerifyCode vc=new VerifyCode();
//获取随机图片
BufferedImage image=vc.getImage();
//获取刚刚生成的随机图片上的文本
String text=vc.getText()[这个方法必须在调用了getImage()方法之后才能使用。因为图片没有生成之前是不存在图片上的文本的。];
System.out.println(text);
//保存图片
FileOutputStream out=new FileOutputStream("F:/xxx.jpg");
VerifyCode.output(image,out);[把image图片保存到out流中!]
}

3在页面中显示动态图片

我们需要写一个VerifyCodeServlet,在这个Servlet中我们生成动态图片,然后它图片写入到response.getOutputStream()流中!然后让页面的元素指定这个VerifyCodServlet即可。
VerifyCodeServlet

public class VerifyCodeServlet extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
VerifyCode vc=new VerifyCode();
BufferedImage image=vc.getImage();
String text=vc.getText();
System.out.println("text:"+text);
VerifyCode.output(image,response.getOutputStream());
}
}

index.jsp

<script type="text/javascript"> function_change(){ var imgEle=document.getElementById("vCode");[获取<img>元素] imgEle.src="/day06_6/VerifyCodeServlet?"+new Date().getTime();[重新指定src!因为有些浏览器会对其进行缓存,所以需要添加不同的参数,保证每次URL的参数都不同。] } </script>
...
<body>
<h1>验证码</h1>
<img id="vCode"src="/day06_6/VerifyCodeServlet"/>
<a href="javascript:_change()">看不清,换一张</a>[点击这个链接会执行_change()函数]
</body>

4在注册页面中使用验证码

<form action="/day06_6/RegistServlet[请求RegistServlet]"method="post">
用户名:<input type="text"name="username"/><br/>
验证码:<input type="text"name="code"size="3"/>
<img id="vCode"src="/day06_6/VerifyCodeServlet"/>
<a href="javascript:_change()">看不清,换一张</a>
<br/>
<input type="submit"value="Submit"/>
</form>

5 RegistServlet

修改VerifyCodeServlet

public class VerifyCodeServlet extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
VerifyCode vc=new VerifyCode();
BufferedImage image=vc.getImage();
request.getSession().setAttribute("vCode",vc.getText());[在session中保存验证码文本]
VerifyCode.output(image,response.getOutputStream());
}
}

RegistServlet

public class RegistServlet extends HttpServlet{
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String username=request.getParameter("username");
String vCode=request.getParameter("code");[获取表单中的验证码,这是用户在表单中填写的。]
String sessionVerifyCode=(String)request.getSession().getAttribute("vCode");[获取session中的验证码,这是在生成验证码图片后,保存在session中的正确的验证码文本。]
if(vCode.equalsIgnoreCase(sessionVerifyCode)[比较用户输入的与真正的是否相同。]){
response.getWriter().print(username+",恭喜!注册成功!");
}else{
response.getWriter().print("验证码错误!");
}
}
}

6总结验证码案例

VerifyCodeServlet:
生成验证码:VerifyCode vc=new VerifyCode();BufferedImage image=vc.getImage();
在session中保存验证码文本:request.getSession.getAttribute(“vCode”,vc.getText());
把验证码输出到页面:VerifyCode.output(image,response.getOutputStream);
regist.jsp:
表单中包含username和code字段;
在表单中给出<img>指向VerifyCodeServlet,用来在页面中显示验证码图片;
提供“看不清,换一张”链接,指向_change()函数;
提交到RegistServlet;
RegistServlet:
获取表单中的username和code;
获取session中的vCode;
比较code和vCode是否相同;
相同说明用户输入的验证码正确,否则输入验证码错误。

你可能感兴趣的:(图片,服务器,Class,验证码,图片验证码)