阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

案例:一次性图片验证码

166次阅读
没有评论

共计 2918 个字符,预计需要花费 8 分钟才能阅读完成。

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() ;
		System.out.println(text);
		// 保存图片
		FileOutputStream out = new FileOutputStream("F:/xxx.jpg");
		VerifyCode.output(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"); imgEle.src = "/day06_6/VerifyCodeServlet?" + new Date().getTime(); } </script> ... <body> <h1> 验证码 </h1> <img id="vCode" src="/day06_6/VerifyCodeServlet"/> <a href="javascript:_change()"> 看不清,换一张 </a> </body>

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

<form action="/day06_6/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()); 
		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"); 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 字段;

​ 在表单中给出 指向 VerifyCodeServlet,用来在页面中显示验证码图片;

​ 提供“看不清,换一张”链接,指向_change()函数;

​ 提交到 RegistServlet;

RegistServlet:

​ 获取表单中的 username 和 code;

​ 获取 session 中的 vCode;

​ 比较 code 和 vCode 是否相同;

​ 相同说明用户输入的验证码正确,否则输入验证码错误。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计2918字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中