java使用servlet画出最简单的验证码二(带干扰因素之线条)

在上一篇实现验证码的基础之上,本篇加上干扰因素线条,基本上原理都不变

1、在login.jsp页面中加入样式代码

<form action="<%=request.getContextPath()%>/action" method="post">
       <div>
           <label class="fl w_20">验证码:</label>
           <span class="fr w_80 verify">
                  <input type="text" class="text_txt code" name="userCode">
                  <img id="num" src="checkCode"  />
                  <a href="javascript:;" 
                           onclick="document.getElementById('num').src='checkCode?'+(new Date()).getTime()">
                                        换一张</a>    
           </span>
           <span class="msg"  style="color:red">
                    <%
                       String codeMsg=(String)request.getAttribute("code_msg");
                     %>
                     <%=codeMsg==null?"":codeMsg %>
           </span>
       </div>
       <div>
           <span class="fr w_80">
                 <input type="submit" style="height: 50px;" value="登录">
           </span>
       </div>
</form>

2、在src下建CheckCodeServlet类用来“画”验证码

package com.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/*
 * 生成验证码
 */
public class CheckCodeServlet extends HttpServlet {

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        OutputStream os=response.getOutputStream();
        
        response.setContentType("image/jpeg");
        //System.out.println("service...");
        //创建图片映射区(画板)
        BufferedImage image=new BufferedImage(80, 40, BufferedImage.TYPE_INT_RGB);
        //获取画笔
        Graphics g=image.getGraphics();
        Random r=new Random();//获取随机数
        g.setColor(new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256)));
        g.fillRect(0, 0, 80, 40);
        //画字符串
        g.setColor(Color.black);
        g.setFont(new Font(null,Font.BOLD,20));//设置字体,粗体,大小
        
        String num=getNum(5);//调用getNum方法
        //将正确的验证码保存到session中
        HttpSession session=request.getSession();
        session.setAttribute("rightCode", num);
        g.drawString(num, 5, 30);
        
        //画线   可以延缓登录时间,减缓程序
        for(int i=0;i<6;i++){
            g.setColor(new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256)));
            g.drawLine(r.nextInt(80), r.nextInt(40), r.nextInt(80), r.nextInt(40));
        }
        
        //压缩图片
        ImageIO.write(image, "jpeg", os);
        os.close();
    }
    
    //返回正确的验证码
    public String getNum(int length){
        StringBuffer sf=new StringBuffer();
        String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        Random r=new Random();
        for(int i=0;i<length;i++){
            int index=r.nextInt(str.length());
            char c=str.charAt(index);
            sf.append(c);
        }
        return sf.toString();
    }

}

3、在src下建ActionServlet类用来处理用户输入的信息与验证码图片的信息匹配问题

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Asdf extends HttpServlet {
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8"); // 输出中文
        PrintWriter out = response.getWriter();
        // 创建session对象
        HttpSession session = request.getSession();
        String userCode = request.getParameter("userCode");// 验证码
        String rightCode = (String) session.getAttribute("rightCode");
        if (!userCode.equalsIgnoreCase(rightCode)) {// 成立则失败
            // 回到登录界面
            request.setAttribute("code_msg", "验证码错误");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        } else {
            out.println("验证码输入正确");
        }
        out.flush();
        out.close();
    }
}

4、最后在web.xml中去配置两个servlet请求

<servlet>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>com.servlet.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ActionServlet</servlet-name>
    <url-pattern>/action</url-pattern>
</servlet-mapping>
  
<servlet>
    <servlet-name>CheckCodeServlet</servlet-name>
    <servlet-class>com.servlet.CheckCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CheckCodeServlet</servlet-name>
    <url-pattern>/checkCode</url-pattern>
</servlet-mapping>

到这里就完成了,接下来看效果图吧,这个是加了修饰样式的,与提供的代码有所差异哈,但问题不大。

小弟学浅,有照顾不周的地方请见谅哈

原文地址:https://www.cnblogs.com/xslzwm/p/9685831.html