zoukankan      html  css  js  c++  java
  • struts向网页输出图片验证码

    前言:今天做个功能需要展示图片到页面,并不是下载,在网上搜了老半天,大部分都是下载,有的话也是只能在IE下进行输出,其它浏览器就都是下载了。

    Action代码:

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public String processImage(){  
    2.     String key = ServletActionContext.getRequest().getParameter("key");  
    3.     if(StringUtils.isEmpty(key)){  
    4.         return "nofindImage";//没有找到图片  
    5.     }  
    6.     ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()  
    7.                  .processDefinitionKey(key)  
    8.                  .singleResult();  
    9.     String diagramResourceName = processDefinition.getDiagramResourceName();  
    10.     InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);  
    11.     ServletActionContext.getContext().put("imageStream", imageStream);  
    12.     return "processImage";  
    13. }  

    注:这里将InputStream放到了Struts2的对象站里面

    此外,也可以通过在action中添加一个getInputName()的方法,在这个方法里面返回上面的InputStream

    XML配置:在action中添加结果

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <result name="processImage" type="stream">  
    2.                <param name="contentType">image/png</param>  
    3.                <param name="inputName">imageStream</param>  
    4.                <param name="bufferSize">4096</param>  
    5.         </result>  


    注:inputName的值对应了我们在action中放入对象栈的key,因为StreamResult的源码中获得inputName就是从栈中获取。

    其它说明:网上部分代码是在action中将InputStream通过Response直接输出,并返回一个null,这样在ie下是可以直接显示图片,在其他浏览器里面都是下载的方式。

    注册需求中,图片验证码是很普遍要求的功能

    啥也不多说了,上代码

    [java] view plain copy
     
    1. import java.awt.Color;  
    2. import java.awt.Font;  
    3. import java.awt.Graphics;  
    4. import java.awt.Graphics2D;  
    5. import java.awt.image.BufferedImage;  
    6. import java.io.ByteArrayInputStream;  
    7. import java.io.ByteArrayOutputStream;  
    8. import java.io.IOException;  
    9. import java.io.InputStream;  
    10. import java.util.Random;  
    11.   
    12. import javax.imageio.ImageIO;  
    13. import javax.imageio.stream.ImageOutputStream;  
    14.   
    15. import org.apache.struts2.ServletActionContext;  
    16.   
    17. import raisi.core.action.BaseApi;  
    18.   
    19. public class ValidatePic extends BaseApi {  
    20.       
    21.     private static final long serialVersionUID = -4159857994104900410L;  
    22.     @Override  
    23.     public Object getModel() {  
    24.         return null;  
    25.     }  
    26.       
    27.     private static final int WIDTH = 120;  
    28.     private static final int HEIGHT = 35;  
    29.       
    30.     public String getValidate() throws IOException{  
    31.         //准备一张图片  
    32.         BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR);  
    33.         //得到图片对象  
    34.         Graphics g =image.getGraphics();  
    35.           
    36.         //1.设置背景色  
    37.         setBackGround(g);  
    38.           
    39.         //2.设置边框  
    40.         setBorder(g);  
    41.           
    42.         //3.画多条干扰线  
    43.         drawRandowLine(g);  
    44.           
    45.         //4.写随机文字或数字  
    46.         String random = drawText((Graphics2D)g);  
    47.         request.getSession().setAttribute("checkcode", random);  
    48.           
    49.   
    50.         ByteArrayOutputStream bs =new ByteArrayOutputStream();  
    51.         ImageOutputStream imOut =ImageIO.createImageOutputStream(bs);  
    52.         ImageIO.write(image,"jpg",imOut);   
    53.         InputStream is =new ByteArrayInputStream(bs.toByteArray());   
    54.         ServletActionContext.getContext().put("imageStream", is);    
    55.           
    56.         return "image";  
    57.     }  
    58.       
    59.     private String drawText(Graphics2D g) {  
    60.           
    61.         g.setColor(Color.RED);  
    62.         g.setFont(new Font("宋体", Font.BOLD, 20));               //设置字体,宋体、粗体、大小  
    63.           
    64.         StringBuffer sb = new StringBuffer();                   //存放验证码  
    65.         //常用汉字码表  
    66.         String base="u7684u4e00u662fu4e86u6211u4e0du4ebau5728u4ed6u6709u8fd9u4e2au4e0au4eecu6765u5230u65f6u5927" +  
    67.                 "u5730u4e3au5b50u4e2du4f60u8bf4u751fu56fdu5e74u7740u5c31u90a3u548cu8981u5979u51fau4e5fu5f97u91cc" +  
    68.                 "u540eu81eau4ee5u4f1au5bb6u53efu4e0bu800cu8fc7u5929u53bbu80fdu5bf9u5c0fu591au7136u4e8eu5fc3u5b66" +  
    69.                 "u4e48u4e4bu90fdu597du770bu8d77u53d1u5f53u6ca1u6210u53eau5982u4e8bu628au8fd8u7528u7b2cu6837u9053" +  
    70.                 "u60f3u4f5cu79cdu5f00u7f8eu603bu4eceu65e0u60c5u5df1u9762u6700u5973u4f46u73b0u524du4e9bu6240u540c" +  
    71.                 "u65e5u624bu53c8u884cu610fu52a8u65b9u671fu5b83u5934u7ecfu957fu513fu56deu4f4du5206u7231u8001u56e0" +  
    72.                 "u5f88u7ed9u540du6cd5u95f4u65afu77e5u4e16u4ec0u4e24u6b21u4f7fu8eabu8005u88abu9ad8u5df2u4eb2u5176" +  
    73.                 "u8fdbu6b64u8bddu5e38u4e0eu6d3bu6b63u611fu89c1u660eu95eeu529bu7406u5c14u70b9u6587u51e0u5b9au672c" +  
    74.                 "u516cu7279u505au5916u5b69u76f8u897fu679cu8d70u5c06u6708u5341u5b9eu5411u58f0u8f66u5168u4fe1u91cd" +  
    75.                 "u4e09u673au5de5u7269u6c14u6bcfu5e76u522bu771fu6253u592au65b0u6bd4u624du4fbfu592bu518du4e66u90e8" +  
    76.                 "u6c34u50cfu773cu7b49u4f53u5374u52a0u7535u4e3bu754cu95e8u5229u6d77u53d7u542cu8868u5fb7u5c11u514b" +  
    77.                 "u4ee3u5458u8bb8u7a1cu5148u53e3u7531u6b7bu5b89u5199u6027u9a6cu5149u767du6216u4f4fu96beu671bu6559" +  
    78.                 "u547du82b1u7ed3u4e50u8272u66f4u62c9u4e1cu795eu8bb0u5904u8ba9u6bcdu7236u5e94u76f4u5b57u573au5e73" +  
    79.                 "u62a5u53cbu5173u653eu81f3u5f20u8ba4u63a5u544au5165u7b11u5185u82f1u519bu5019u6c11u5c81u5f80u4f55" +  
    80.                 "u5ea6u5c71u89c9u8defu5e26u4e07u7537u8fb9u98ceu89e3u53ebu4efbu91d1u5febu539fu5403u5988u53d8u901a" +  
    81.                 "u5e08u7acbu8c61u6570u56dbu5931u6ee1u6218u8fdcu683cu58ebu97f3u8f7bu76eeu6761u5462u75c5u59cbu8fbe" +  
    82.                 "u6df1u5b8cu4ecau63d0u6c42u6e05u738bu5316u7a7au4e1au601du5207u600eu975eu627eu7247u7f57u94b1u7d36" +  
    83.                 "u5417u8bedu5143u559cu66feu79bbu98deu79d1u8a00u5e72u6d41u6b22u7ea6u5404u5373u6307u5408u53cdu9898" +  
    84.                 "u5fc5u8be5u8bbau4ea4u7ec8u6797u8bf7u533bu665au5236u7403u51b3u7aa2u4f20u753bu4fddu8bfbu8fd0u53ca" +  
    85.                 "u5219u623fu65e9u9662u91cfu82e6u706bu5e03u54c1u8fd1u5750u4ea7u7b54u661fu7cbeu89c6u4e94u8fdeu53f8" +  
    86.                 "u5df4u5947u7ba1u7c7bu672au670bu4e14u5a5au53f0u591cu9752u5317u961fu4e45u4e4eu8d8au89c2u843du5c3d" +  
    87.                 "u5f62u5f71u7ea2u7238u767eu4ee4u5468u5427u8bc6u6b65u5e0cu4e9au672fu7559u5e02u534au70edu9001u5174" +  
    88.                 "u9020u8c08u5bb9u6781u968fu6f14u6536u9996u6839u8bb2u6574u5f0fu53d6u7167u529eu5f3au77f3u53e4u534e" +  
    89.                 "u8ae3u62ffu8ba1u60a8u88c5u4f3cu8db3u53ccu59bbu5c3cu8f6cu8bc9u7c73u79f0u4e3du5ba2u5357u9886u8282" +  
    90.                 "u8863u7ad9u9ed1u523bu7edfu65adu798fu57ceu6545u5386u60cau8138u9009u5305u7d27u4e89u53e6u5efau7ef4" +  
    91.                 "u7eddu6811u7cfbu4f24u793au613fu6301u5343u53f2u8c01u51c6u8054u5987u7eaau57fau4e70u5fd7u9759u963f" +  
    92.                 "u8bd7u72ecu590du75dbu6d88u793eu7b97u4e49u7adfu786eu9152u9700u5355u6cbbu5361u5e78u5170u5ff5u4e3e" +  
    93.                 "u4ec5u949fu6015u5171u6bdbu53e5u606fu529fu5b98u5f85u7a76u8ddfu7a7fu5ba4u6613u6e38u7a0bu53f7u5c45" +  
    94.                 "u8003u7a81u76aeu54eau8d39u5012u4ef7u56feu5177u521au8111u6c38u6b4cu54cdu5546u793cu7ec6u4e13u9ec4" +  
    95.                 "u5757u811au5473u7075u6539u636eu822cu7834u5f15u98dfu4ecdu5b58u4f17u6ce8u7b14u751au67d0u6c89u8840" +  
    96.                 "u5907u4e60u6821u9ed8u52a1u571fu5faeu5a18u987bu8bd5u6000u6599u8c03u5e7fu8716u82cfu663eu8d5bu67e5" +  
    97.                 "u5bc6u8baeu5e95u5217u5bccu68a6u9519u5ea7u53c2u516bu9664u8dd1u4eaeu5047u5370u8bbeu7ebfu6e29u867d" +  
    98.                 "u6389u4eacu521du517bu9999u505cu9645u81f4u9633u7eb8u674eu7eb3u9a8cu52a9u6fc0u591fu4e25u8bc1u5e1d" +  
    99.                 "u996du5fd8u8da3u652fu6625u96c6u4e08u6728u7814u73edu666eu5bfcu987fu7761u5c55u8df3u83b7u827au516d" +  
    100.                 "u6ce2u5bdfu7fa4u7687u6bb5u6025u5eadu521bu533au5965u5668u8c22u5f1fu5e97u5426u5bb3u8349u6392u80cc" +  
    101.                 "u6b62u7ec4u5ddeu671du5c01u775bu677fu89d2u51b5u66f2u9986u80b2u5fd9u8d28u6cb3u7eedu54e5u547cu82e5" +  
    102.                 "u63a8u5883u9047u96e8u6807u59d0u5145u56f4u6848u4f26u62a4u51b7u8b66u8d1du8457u96eau7d22u5267u554a" +  
    103.                 "u8239u9669u70dfu4f9du6597u503cu5e2eu6c49u6162u4f5bu80afu95fbu5531u6c99u5c40u4f2fu65cfu4f4eu73a9" +  
    104.                 "u8d44u5c4bu51fbu901fu987eu6ceau6d32u56e2u5723u65c1u5802u5175u4e03u9732u56edu725bu54edu65c5u8857" +  
    105.                 "u52b3u578bu70c8u59d1u9648u83abu9c7cu5f02u62b1u5b9du6743u9c81u7b80u6001u7ea7u7968u602au5bfbu6740" +  
    106.                 "u5f8bu80dcu4efdu6c7du53f3u6d0bu8303u5e8au821eu79d8u5348u767bu697cu8d35u5438u8d23u4f8bu8ffdu8f83" +  
    107.                 "u804cu5c5eu6e10u5de6u5f55u4e1du7259u515au7ee7u6258u8d76u7ae0u667au51b2u53f6u80e1u5409u5356u575a" +  
    108.                 "u559du8089u9057u6551u4feeu677eu4e34u85cfu62c5u620fu5584u536bu836fu60b2u6562u9760u4f0au6751u6234" +  
    109.                 "u8bcdu68eeu8033u5deeu77edu7956u4e91u89c4u7a97u6563u8ff7u6cb9u65e7u9002u4e61u67b6u6069u6295u5f39" +  
    110.                 "u94c1u535au96f7u5e9cu538bu8d85u8d1fu52d2u6742u9192u6d17u91c7u6bebu5634u6bd5u4e5du51b0u65e2u72b6" +  
    111.                 "u4e71u666fu5e2du73cdu7ae5u9876u6d3eu7d20u8131u519cu7591u7ec3u91ceu6309u72afu62cdu5f81u574fu9aa8" +  
    112.                 "u4f59u627fu7f6eu81d3u5f69u706fu5de8u7434u514du73afu59c6u6697u6362u6280u7ffbu675fu589eu5fcdu9910" +  
    113.                 "u6d1bu585eu7f3au5fc6u5224u6b27u5c42u4ed8u9635u739bu6279u5c9bu9879u72d7u4f11u61c2u6b66u9769u826f" +  
    114.                 "u6076u604bu59d4u62e5u5a1cu5999u63a2u5440u8425u9000u6447u5f04u684cu719fu8bfau5ba3u94f6u52bfu5956" +  
    115.                 "u5babu5ffdu5957u5eb7u4f9bu4f18u8bfeu9e1fu558au964du590fu56f0u5218u7f6au4ea1u978bu5065u6a21u8d25" +  
    116.                 "u4f34u5b88u6325u9c9cu8d22u5b64u67aau7981u6050u4f19u6770u8ff9u59b9u85f8u904du76d6u526fu5766u724c" +  
    117.                 "u6c5fu987au79cbu8428u83dcu5212u6388u5f52u6d6au542cu51e1u9884u5976u96c4u5347u7883u7f16u5178u888b" +  
    118.                 "u83b1u542bu76dbu6d4eu8499u68cbu7aefu817fu62dbu91cau4ecbu70e7u8bef";  
    119.   
    120.         int hor = 5;  
    121.         for(int i=0;i<4;i++){  
    122.             //获取旋转的度数  
    123.             int degree = (new Random().nextInt(50))-25;  
    124.               
    125.             String text = base.charAt(new Random().nextInt(base.length()))+"";              //得到随机文字  
    126.             sb.append(text);                                                                //将随机文字加入验证码  
    127.             g.rotate(degree*Math.PI/180, hor, 5);               //设置旋转  
    128.             g.drawString(text, hor, 20);  
    129.             g.rotate(-degree*Math.PI/180, hor, 5);              //为了不影响下一个随机文字的输出,旋转回去  
    130.             hor+=30;  
    131.         }  
    132.         System.out.println("sb--->"+sb);  
    133.         return sb.toString();  
    134.     }  
    135.     private void drawRandowLine(Graphics g) {  
    136.         g.setColor(Color.GREEN);  
    137.         for(int i=0;i<5;i++){  
    138.             int x1 = new Random().nextInt(WIDTH);       //随机生成0~120之间的整数   
    139.             int x2 = new Random().nextInt(WIDTH);       //随机生成0~120之间的整数   
    140.             int y1 = new Random().nextInt(HEIGHT);      //随机生成0~25之间的整数   
    141.             int y2 = new Random().nextInt(HEIGHT);      //随机生成0~25之间的整数   
    142.               
    143.             g.drawLine(x1, y1, x2, y2);  
    144.         }  
    145.     }  
    146.     private void setBackGround(Graphics g) {  
    147.         g.setColor(Color.WHITE);  
    148.         g.fillRect(0, 0, WIDTH, HEIGHT);            //白色铺满  
    149.     }  
    150.     private void setBorder(Graphics g) {  
    151.         g.setColor(Color.BLUE);  
    152.         g.drawRect(1, 1, WIDTH-2, HEIGHT-2);  
    153.           
    154.     }  
    155. }  

    struts配置如下

    [html] view plain copy
     
    1. <result name="image" type="stream">  
    2.     <param name="contentType">image/png</param>    
    3.         <param name="inputName">imageStream</param>    
    4.         <param name="bufferSize">4096</param>             
    5. </result>    

    页面的调用如下

    [html] view plain copy
     
    1. <img  src="<%=context %>/***!getValidate.action">  

    效果如下

     

  • 相关阅读:
    (七)策略模式详解
    (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
    递归锁,死锁,使用递归锁解决死锁,信号量
    并发编程中的GIL锁(全局解释器锁)自己理解的他为啥存在
    线程了解以及创建线程的Threading模块中的部分方法
    进程 >> 互斥锁、队列与管道、生产者消费者模型
    进程比较基础的内容
    基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程
    网络基础 + 简易服务端和客户端
    单例模式
  • 原文地址:https://www.cnblogs.com/ouyangping/p/6512745.html
Copyright © 2011-2022 走看看