• 验证码(1)


    原理:首先我们使用BufferedImage对象获取一个特定高和宽的缓存图片,然后我们将对这个图片对象进行一些修饰加工

    setBorder()来设置图片的边框

    setBackground来设置图片的背景颜色

    drawRandomLine来设置随机线条

    drawRandomNumber来设置随机数字

    然后通过响应头Content-type告诉浏览器以图片的方式打开数据

    最后在使用ImageIO对象的write方法将图片写入到response.getOutputStream流中

    代码如下:

     
    1. <span style="white-space:pre">  </span>//实现随机图片的产生  
    2.     public void test4(HttpServletResponse response) throws Exception{  
    3.           
    4.         final int width = 120;//宽  
    5.         final int height = 35;//高  
    6.           
    7.         BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);  
    8.         Graphics g = image.getGraphics();  
    9.         //设置背景色  
    10.         setBackground(g,width,height);  
    11.         //设置边框  
    12.         setBorder(g,width,height);  
    13.         //设置随机线条  
    14.         drawRandomLine(g,width,height);  
    15.         //设置随机数  
    16.         drawRandomNumber((Graphics2D)g,width,height);  
    17.           
    18.         //不要缓存  
    19.         /*response.setDateHeader("expires", -1); 
    20.         //告诉所有浏览器不要缓存 
    21.         response.setHeader("Cache-control", "no-cache"); 
    22.         response.setHeader("Pragma", "no-cache");*/  
    23.         response.setHeader("content-type", "image/jpeg");  
    24.           
    25.         ImageIO.write(image,"jpg",response.getOutputStream());  
    26.           
    27.     }  
    [
    1. <span style="white-space:pre">  </span>/** 
    2.      * 设置背景色 
    3.      * @param g 
    4.      * @param width 
    5.      * @param height 
    6.      */  
    7.     public void setBackground(Graphics g,int width,int height){  
    8.         g.setColor(Color.WHITE);  
    9.         g.fillRect(0, 0, width, height);  
    10.     }  
    11.       
    12.     /** 
    13.      * 设置随机线条 
    14.      * @param g 
    15.      * @param width 
    16.      * @param height 
    17.      */  
    18.     public void drawRandomLine(Graphics g,int width,int height){  
    19.         g.setColor(Color.GREEN);  
    20.         for(int i=0;i<5;i++){  
    21.             int x1 = new Random().nextInt(width);  
    22.             int y1 = new Random().nextInt(height);  
    23.             int x2 = new Random().nextInt(width);  
    24.             int y2 = new Random().nextInt(height);  
    25.             g.drawLine(x1, y1, x2, y2);  
    26.         }  
    27.     }  
    28.       
    29.     /** 
    30.      * 设置边框 
    31.      * @param g 
    32.      * @param width 
    33.      * @param height 
    34.      */  
    35.     public void setBorder(Graphics g,int width,int height){  
    36.         g.setColor(Color.BLUE);  
    37.         g.drawRect(1, 1, width-2, height-2);  
    38.     }  
    39.       
    40.     /** 
    41.      * 设置随机数 
    42.      * @param g 
    43.      * @param width 
    44.      * @param height 
    45.      */  
    46.     public void drawRandomNumber(Graphics2D g,int width,int height){  
    47.         g.setColor(Color.RED);  
    48.         g.setFont(new Font("宋体",Font.BOLD,20));  
    49.           
    50.         //常见的中文字  
    51.         //[u4e00-u9fa5]  
    52.         String base = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";  
    53.         int x = 5;  
    54.         for(int i=0;i<4;i++){  
    55.             int degree = new Random().nextInt(61)-30;//new Random().nextInt()%30;//-30---30  
    56.             String content = base.charAt(new Random().nextInt(base.length()))+"";  
    57.             g.rotate(degree*Math.PI/180,x,20);  
    58.             g.drawString(content, x, 20);  
    59.             g.rotate(-degree*Math.PI/180, x, 20);  
    60.             x += 30;  
    61.         }  
    62.           
    63.     }  


    这里我们的随机图片中显示的是常见中文。

    这里我们看到了,但是我们这时候点击刷新的时候,发现图片是不变的,这个很纠结的,原因也很简单,因为浏览器去拿取缓存的图片的了,所以我们要解决这个问题,我们只需要告诉浏览器不要去拿取缓存:

     
    1. //不要缓存  
    2. response.setDateHeader("expires", -1);  
    3. //告诉所有浏览器不要缓存  
    4. response.setHeader("Cache-control", "no-cache");  
    5. response.setHeader("Pragma", "no-cache");  
  • 相关阅读:
    UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
    UVa 1658 (拆点法 最小费用流) Admiral
    UVa 11082 (网络流建模) Matrix Decompressing
    UVa 753 (二分图最大匹配) A Plug for UNIX
    UVa 1451 (数形结合 单调栈) Average
    UVa 1471 (LIS变形) Defense Lines
    UVa 11572 (滑动窗口) Unique Snowflakes
    UVa 1606 (极角排序) Amphiphilic Carbon Molecules
    UVa 11054 Wine trading in Gergovia
    UVa 140 (枚举排列) Bandwidth
  • 原文地址:https://www.cnblogs.com/keyi/p/8350469.html
Copyright © 2020-2023  润新知