zoukankan      html  css  js  c++  java
  • servletResponse 随机生成图片验证码

    /***********************************servlet页面************************************/

    package response;

    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 ResponseDemo4 extends HttpServlet {
        //定义图片的宽度
        public static final int WIDTH = 120;
        //定义图片的高度
        public static final int HEIGHT= 30;
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //在内存里面构建出一副图片
            BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
            //得到该图形
            Graphics g = image.getGraphics();
            //1,设置背景色
            setBackGround(g);
            //2,设置边框
            setBorder(g);
            //3,画干扰线
            drawRandomLine(g);
            //4,谢随机数
            drawRandomNum((Graphics2D)g);
            //5,图形写给浏览器
            response.setContentType("image/jpeg");//通知浏览器以jpeg格式打开图片
            //发头控制浏览器不要缓存
            response.setDateHeader("expries", -1);
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Pragma", "no-cache");
            ImageIO.write(image, "jpg", response.getOutputStream());
        }
        //填充汉字,Graphics没有旋转的操作,所以这里写成Graphics2D,但Graphics2D存在兼容性问题
        private void drawRandomNum(Graphics2D g) {
            //设置字体颜色
            g.setColor(Color.RED);
            //设置字体为宋体,粗体,大小20
            g.setFont(new Font("宋体",Font.BOLD,20));
            //汉字常用字
            String base = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";
            int x = 5;//设置汉字出现的位置
            for(int i = 0;i<4;i++){
                //设置字的旋转弧度,不超过30度
    //            int degree = new Random().nextInt(30);//这样设计旋转只会在一个方向
                //任意的随机数%30得到的数肯定比30小,这样也保证汉字的旋转弧度在-30~30之间
                int degree = new Random().nextInt()%30;
                //将得到的字符转换成字符串
                String ch = base.charAt(new Random().nextInt(base.length()))+"";
                //设置旋转角度
                g.rotate(degree*Math.PI/180, x, 20);
                //填充汉字
                g.drawString(ch, x, 20);
                //旋转完要将旋转操作恢复,以免影响下一次操作
                g.rotate(-degree*Math.PI/180, x, 20);
                x += 30; //设置下一个字的出现位置
            }
            
        }

        private void drawRandomLine(Graphics g) {
            //设置干扰线的颜色为绿色
            g.setColor(Color.GREEN);
            //画5条干扰线
            for(int i = 0;i<5;i++){
                //干扰线的起始坐标
                int x1 = new Random().nextInt(WIDTH);
                int y1 = new Random().nextInt(HEIGHT);
                //干扰线的结束坐标
                int x2 = new Random().nextInt(WIDTH);
                int y2 = new Random().nextInt(HEIGHT);
                //画干扰线
                g.drawLine(x1, y1, x2, y2);
            }
        }

        private void setBorder(Graphics g) {
            //设置边框颜色为蓝色
            g.setColor(Color.BLUE);
            //填充(从0开始的话,边框画到外面去了)
            g.drawRect(1, 1, WIDTH-2, HEIGHT-2);
            
        }

        private void setBackGround(Graphics g) {
            //背景色设置为白色
            g.setColor(Color.WHITE);
            //填充矩形
            g.fillRect(0, 0, WIDTH, HEIGHT);
     
        }
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }

    }
    /************************************************注册页面*******************************************************/

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>用户注册</title>
    <script type="text/javascript">
        function changeImg(img){
            img.src = img.src + "?" + new Date().getTime();
        }
    </script>
    </head>
    <body>
        <form>
            用户名:<input type="text" name="user"/><br/>
            密码:<input type="password" name="pwd"/><br/>
            验证码:<input type="text" name="check"/>
            <!-- 实现点击图片验证码就换一张图片 -->
            <img src="/requestandresponse/ResponseDemo4" onclick="changeImg(this)" alt="换一张" style="cursor: hand"><br/>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>

  • 相关阅读:
    POJ 2723 Get Luffy Out(2-SAT)
    ZOJ 3613 Wormhole Transport
    HDU 4085 Peach Blossom Spring
    NBUT 1221 Intermediary
    NBUT 1223 Friends number
    NBUT 1220 SPY
    NBUT 1218 You are my brother
    PAT 1131. Subway Map (30)
    ZSTU OJ 4273 玩具
    ZSTU OJ 4272 最佳淘汰算法
  • 原文地址:https://www.cnblogs.com/siashan/p/3913099.html
Copyright © 2011-2022 走看看