[JAVA]实现成语验证码
生成验证码,WEB-INF下一个idiom.txt文件,存放四字成语。
package xyz.xioaxin12.utils; import ... public class ImgToolServlet extends HttpServlet { // 集合中保存所有成语 private List<String> words = new ArrayList<String>(); @Override public void init() throws ServletException { // 初始化阶段,读取new_words.txt // web工程中读取 文件,必须使用绝对磁盘路径 String path = getServletContext().getRealPath("/WEB-INF/idiom.txt"); try { BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(path), "utf-8")); String line; while ((line = reader.readLine()) != null) { words.add(line); } reader.close(); } catch (IOException e) { e.printStackTrace(); } } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 禁止缓存 // response.setHeader("Cache-Control", "no-cache"); // response.setHeader("Pragma", "no-cache"); // response.setDateHeader("Expires", -1); int width = 120; int height = 30; // 步骤一 绘制一张内存中图片 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 步骤二 图片绘制背景颜色 ---通过绘图对象 Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔 // 绘制任何图形之前 都必须指定一个颜色 graphics.setColor(getRandColor(200, 250)); graphics.fillRect(0, 0, width, height); // 步骤三 绘制边框 graphics.setColor(Color.WHITE); graphics.drawRect(0, 0, width - 1, height - 1); // 步骤四 四个随机数字 Graphics2D graphics2d = (Graphics2D) graphics; // 设置输出字体 graphics2d.setFont(new Font("宋体", Font.BOLD, 18)); Random random = new Random();// 生成随机数 int index = random.nextInt(words.size()); String word = words.get(index);// 获得成语 // 定义x坐标 int x = 10; for (int i = 0; i < word.length(); i++) { // 随机颜色 graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110))); // 旋转 -30 --- 30度 int jiaodu = random.nextInt(60) - 30; // 换算弧度 double theta = jiaodu * Math.PI / 180; // 获得字母数字 char c = word.charAt(i); // 将c 输出到图片 graphics2d.rotate(theta, x, 20); graphics2d.drawString(String.valueOf(c), x, 20); graphics2d.rotate(-theta, x, 20); x += 30; } // 将验证码内容保存session request.getSession().setAttribute("checkcode_session", word); System.out.println(word); // 步骤五 绘制干扰线 graphics.setColor(getRandColor(160, 200)); int x1; int x2; int y1; int y2; for (int i = 0; i < 30; i++) { x1 = random.nextInt(width); x2 = random.nextInt(12); y1 = random.nextInt(height); y2 = random.nextInt(12); graphics.drawLine(x1, y1, x1 + x2, x2 + y2); } // 将上面图片输出到浏览器 ImageIO graphics.dispose();// 释放资源 ImageIO.write(bufferedImage, "jpg", response.getOutputStream()); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /** * 取其某一范围的color * * @param fc int 范围参数1 * @param bc int 范围参数2 * @return Color */ private Color getRandColor(int fc, int bc) { // 取其随机颜色 Random random = new Random(); if (fc > 255) { fc = 255; } if (bc > 255) { bc = 255; } int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } }
index.jsp表单
<%-- Created by IntelliJ IDEA. User: 小信 Date: 2018/8/10 Time: 7:45 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <script type="text/javascript"> function change() { document.getElementById("im").src = "${pageContext.request.contextPath}/tool?time" + new Date().getTime(); }; </script> <body> ${requestScope["regist.message"] } <br/> <br/> <br/> <form action="${pageContext.request.contextPath }/validation" method="post"> <input type="text" name="checkcode" id="checkcode"> <input type="submit" value="验证"/> </form> <img src='${pageContext.request.contextPath}/tool' id="im" onclick="change();"><span id="checkcode_span"><a href="javascript:void(0)" onclick="change();"><font color='black'>换一张</font></a><br/></span> </body> </html>
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>imgtool</servlet-name> <servlet-class>xyz.xioaxin12.utils.ImgToolServlet</servlet-class> </servlet> <servlet> <servlet-name>ValidationServlet</servlet-name> <servlet-class>xyz.xioaxin12.dao.ValidationServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ValidationServlet</servlet-name> <url-pattern>/validation</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>imgtool</servlet-name> <url-pattern>/tool</url-pattern> </servlet-mapping> </web-app>
实现检验验证码,错误输出错误信息,重新回到本页面。正确则转发到login.jsp页面。
package xyz.xioaxin12.dao; import ... public class ValidationServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决乱码 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8"); // 验证码操作 String checkcode = request.getParameter("checkcode"); String _checkcode = (String) request.getSession().getAttribute( "checkcode_session"); System.out.println("checkcode--" + checkcode); System.out.println("checkcode_session--" + _checkcode); request.getSession().removeAttribute("checkcode_session"); if (_checkcode == null || (!_checkcode.equals(checkcode))) { request.setAttribute("regist.message", "验证码不正确"); request.getRequestDispatcher("/index.jsp").forward(request, response); return; } request.getRequestDispatcher("/login.jsp").forward(request,response); } }
如图:
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 xiaoxin1218@qq.com
文章标题:[JAVA]实现成语验证码
文章字数:1.1k
本文作者:周信
发布时间:2019-10-16, 18:36:58
最后更新:2023-05-03, 10:25:35
原始链接:http://zx21.xyz/2019/10/16/JAVA-实现成语验证码/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。