zoukankan      html  css  js  c++  java
  • servlet输出随机图片(验证码)

    package com.baidu.web.servlet;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    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;
    
    
    //输出一张随机图片
    public class ResponseDemo extends HttpServlet {
        
        public static final int WIDTH = 120;
        public static final int HEIGHT = 25;
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            //BufferedImage image = new BufferedImage(width, height, imageType)
            
            BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
            
            Graphics graphics = image.getGraphics();
            
            //1.设置背景色
            setBackGround(graphics);
            
            //2.设置边框
            setBorder(graphics);
            
            //3.画干扰线
            drawRandomLine(graphics);
            
            //4.写随机数
            Graphics2D graphics2d = (Graphics2D) graphics;
            drawRandomNum(graphics2d);
            
            //5.图形写给浏览器
            drawToBrower(graphics ,response,image);
            
            //控制浏览器不要缓存
            response.setDateHeader("expries", -1);
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Prama", "no-cache");
            ImageIO.write(image, "jpg", response.getOutputStream());
        }
    
        private void drawRandomNum(Graphics2D graphics) {
            graphics.setColor(Color.RED);
            graphics.setFont(new Font("宋体" , Font.BOLD , 20));
            
            //汉字区间 [u4e00 u9fa5]
            //常用的汉字
            String baseString = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";
            
            int x = 5;
            for(int i = 0;i < 4; i++){
                
                int degree = new Random().nextInt()%30;
                
                String ch = baseString.charAt(new Random().nextInt(baseString.length())) + "";
                
                graphics.rotate(degree*Math.PI/180 , x , 20);//设置旋转角度
                
                graphics.drawString(ch, x , 20);
                
                graphics.rotate(-degree*Math.PI/180, x ,20);
                
                x += 30;
                
                
            }
        }
    
        private void drawToBrower(Graphics graphics, HttpServletResponse response,
                BufferedImage image) {
            
            response.setContentType("image/jpeg");
            try {
                ImageIO.write(image, "jpg", response.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private void drawRandomLine(Graphics graphics) {
            graphics.setColor(Color.GREEN);
            
            for(int i = 0;i < 5 ;i++){
                int xStartPoint = new Random().nextInt(WIDTH);
                int yStartPoint = new Random().nextInt(HEIGHT);
                
                int xEndPoint = new Random().nextInt(WIDTH);
                int yEndPoint = new Random().nextInt(HEIGHT);
                
                graphics.drawLine(xStartPoint, yStartPoint, xEndPoint, yEndPoint);
            }
        }
    
    
        private void setBorder(Graphics graphics) {
            graphics.setColor(Color.BLUE);
            graphics.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
        }
    
    
        private void setBackGround(Graphics graphics) {
            graphics.setColor(Color.WHITE);
            graphics.fillRect(0, 0, WIDTH, HEIGHT);
        }
    
    
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            
            
        }
    }

    html

    <!DOCTYPE html>
    <html>
      <head>
        <title>register.html</title>
        
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="this is my page">
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        
        <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
        
        <script type="text/javascript">
            function changeImage(img){
                //alert("haha");
                img.src = img.src + "?" + new Date().getTime();
            }
        </script>
    
      </head>
      
      <body>
        <form action="">
            用户名:<input type="text" name="username"><br/>
             密码: <input type="password" name="password"><br/>
             认证码:<input type="text" name="checkcode"><img src="/TestJsp/servlet/ResponseDemo" onclick="changeImage(this)">
            <input type="submit" value="注册">
        </form>
      </body>
    </html>

    参考资料

    http://blog.csdn.net/lanshengsheng2012/article/details/8970090

  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/sysout/p/5192371.html
Copyright © 2011-2022 走看看