BitTigerio 2018-01-21
方法一:BufferedImage+Graphics制作验证码
1.制作JSP页面(如图)
代码如下:
<body> <form action="<%=request.getContextPath()%>/servlet/LoginServlet" method="get" /> 验证码:<input type="text" name="checkcode"/> <img alt="验证码" id="imagecode" src="<%=request.getContextPath()%>/servlet/ImageServlet"/> <a href="javascript:reloadCode();">看不清楚</a><br> <input type="submit" value="提交"> </form> </body>
2.实现ImageServlet
public class ImageServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{ //制作图片 BufferedImage bi=new BufferedImage(68,22,BufferedImage.TYPE_INT_RGB); Graphics g=bi.getGraphics(); //设置颜色并绘制 Color c=new java.awt.Color(200, 150, 255); g.setColor(c); g.fillRect(0, 0, 68, 22); //设置内容 char ch[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray(); //随机数--通过随机数随机产生颜色和字母、数字 Random r=new Random(); int len=ch.length,index; StringBuffer sb=new StringBuffer(); for(int i=0;i<4;i++){ //随机产生字母、数字 index=r.nextInt(len); //随机产生颜色 g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255))); //画出字母、数字 g.drawString(ch[index]+"", (i*15)+3, 18); //存储当前字母、数字 sb.append(ch[index]); } //将当前字母、数字存入session request.getSession().setAttribute("piccode", sb.toString()); //输出图片 ImageIO.write(bi, "JPG", response.getOutputStream()); } }
3.实现点击“看不清楚”换一张图片(修改Jsp)
**在form标签前、body标签内插入:
<script type="text/javascript"> function reloadCode(){ //通过time来区分不同的时间,从而刷新验证码图片 var time=new Date().getTime(); document.getElementById("imagecode").src="<%=request.getContextPath()%>/servlet/ImageServlet?d="+time; } </script>
**注:其中,必须加入time来区分不同的路径,否则浏览器中会有缓存,点击之后还是原来的图!!
4.实现验证码的验证(实现LoginServlet)
public class LoginServlet extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException{ //获取图片内容 String piccode=(String)request.getSession().getAttribute("piccode"); //获取输入内容 String checkcode=request.getParameter("checkcode"); //不区分大小写 checkcode=checkcode.toUpperCase(); //防止乱码 response.setContentType("text/html;charset=gbk"); PrintWriter out=response.getWriter(); //验证并输出结果 if(checkcode.equals(piccode)){ out.println("验证码输入正确!"); }else{ out.println("验证码输入错误!!"); } out.flush(); out.close(); } }
--未完待续--
**注:学习自慕课网《Java实现验证码制作》,附链接https://www.imooc.com/learn/283