Java 代码实现验证码功能

    xiaoxiao2023-12-06  117

    需求:网页登录的时候我们需要增加一个验证码

     

    我这里使用了 SpringMVC 里面的注解开发, CheckCodeServlet 是一个Controller,用去接受 ~/checkCode(~是项目的路径) 的请求

    import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; /** * 验证码 */ @Controller public class CheckCodeServlet { @RequestMapping("/checkCode") public void checkCode(HttpServletRequest request, HttpServletResponse response) throws IOException { //服务器通知浏览器不要缓存 response.setHeader("pragma", "no-cache"); response.setHeader("cache-control", "no-cache"); response.setHeader("expires", "0"); //在内存中创建一个长80,宽30的图片,默认黑色背景 //参数一:长 //参数二:宽 //参数三:颜色 int width = 80; int height = 30; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //获取画笔 Graphics g = image.getGraphics(); //设置画笔颜色为灰色 g.setColor(Color.GRAY); //填充图片 g.fillRect(0, 0, width, height); //产生4个随机验证码,12Ey String checkCode = getCheckCode(); //将验证码放入HttpSession中 request.getSession().setAttribute("CHECKCODE_SERVER", checkCode); //设置画笔颜色为黄色 g.setColor(Color.YELLOW); //设置字体的小大 g.setFont(new Font("黑体", Font.BOLD, 24)); //向图片上写入验证码 g.drawString(checkCode, 15, 25); //将内存中的图片输出到浏览器 //参数一:图片对象 //参数二:图片的格式,如PNG,JPG,GIF //参数三:图片输出到哪里去 ImageIO.write(image, "PNG", response.getOutputStream()); } /** * 产生4位随机字符串 */ private String getCheckCode() { String base = "0123456789ABCDEFGabcdefg"; int size = base.length(); Random r = new Random(); StringBuilder sb = new StringBuilder(); for (int i = 1; i <= 4; i++) { //产生0到size-1的随机值 int index = r.nextInt(size); //在base字符串中获取下标为index的字符 char c = base.charAt(index); //将c放入到StringBuffer中去 sb.append(c); } return sb.toString(); } }

    这里我验证码提交框的 name 是 check, 我前面是通过把正确的验证码存入Session域中,和用户通过表单提交的进行对比,从而实现验证码判断的功能。登录成功后需要清除存入 Session 域中的验证码值。

    //验证校验 String check = request.getParameter("check"); //从sesion中获取验证码 HttpSession session = request.getSession(); String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER"); session.removeAttribute("CHECKCODE_SERVER");//为了保证验证码只能使用一次 //比较 if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){ //验证码错误处理逻辑 } //验证码正确处理逻辑

    验证码图片添加了一个点击事件,每次点击都会请求服务器重新返回一个验证码图片 

    <tr> <td class="td_left"> <label for="check">验证码</label> </td> <td class="td_right check"> <input type="text" id="check" name="check" class="check"> <!--checkCode?--> <img src="checkCode" height="32px" alt="" onclick="changeCheckCode(this)"> <script type="text/javascript"> //图片点击事件 function changeCheckCode(img) { img.src = "checkCode?" + new Date().getTime(); } </script> </td> </tr>

     

    最新回复(0)