zoukankan      html  css  js  c++  java
  • web 验证码,草稿,可用

    登录界面:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>login</title>
    </head>
    <body>
        <!-- web3:项目名,在LoginServlet前必须加项目名,如果不加则默认视为工作空间地址 -->
        <form action="/web3/LoginServlet" method="post">
            username:<input type="text" name="username" /> <br><br>
            password:<input type="password" name="password" /><br><br>
            验证码:<img alt="验证码" src="/web3/RandomImageServlet"><br><br>
            <input type="submit" value="login"> <br>
        </form>
    </body>
    </html>
    View Code

    Servlet:

    public class RandomImageServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            resp.setContentType("image/jpeg");
            // 禁止浏览器缓存图片
            // 3种禁止缓存的头字段
            resp.setHeader("expires", "-1");
            resp.setHeader("cache-control", "no-cache");
            resp.setHeader("pragma", "no-cache");
    
            BufferedImage im = new BufferedImage(80, 40, BufferedImage.TYPE_INT_RGB);
            Graphics g = im.getGraphics();
            g.setColor(Color.WHITE);// 设置颜色
            g.fillRect(0, 0, 80, 40);// 填充颜色
            g.setColor(Color.BLACK);
            g.setFont(new Font("TimesRoman", Font.PLAIN, 20));
            String str = generateString();
            g.drawString(str, 15, 15);
    
            // g.drawLine(10, 1, 80, 40);
            paint(g);
            ImageIO.write(im, "jpg", resp.getOutputStream());
    
        }
    
        // 设置线宽
        public void paint(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            Stroke st = g2d.getStroke();
            Stroke bs;
            // LINE_TYPE_DASHED
            bs = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
                    0, new float[] { 16, 4 }, 0);
            g2d.setStroke(bs);
            g2d.drawLine(10, 1, 80, 40);
    
            g2d.setStroke(st);
        }
    
        private String generateString() {
            String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWZXY0123456789";
            int length = s.length();
            Random ran = new Random();
            StringBuilder sb = new StringBuilder();
            sb.append(s.charAt(ran.nextInt(length)));
            sb.append(s.charAt(ran.nextInt(length)));
            sb.append(s.charAt(ran.nextInt(length)));
            sb.append(s.charAt(ran.nextInt(length)));
            sb.append(s.charAt(ran.nextInt(length)));
            return sb.toString();
        }
    }
  • 相关阅读:
    YARN调度器(Scheduler)详解
    eaysui datagrid编辑时表格变宽变形问题解决
    超简单!两步实现Wordpress评论微信通知~
    基于混合模型的语音降噪效果提升
    无线路由器,86式墙壁路由器,连接时,子路由器不能上网
    vue 动态绑定NavMenu 导航菜单(两级)
    SVN代码迁移至Gitlab(保留日志)
    Spring Boot 获取项目路径或文件
    Spring Boot使用 @Async 注解进行异步调用
    【DVWA】安全测试工具之BurpSuite
  • 原文地址:https://www.cnblogs.com/mada0/p/4778856.html
Copyright © 2011-2022 走看看