在  web.xml里面加入 下面的代码:

<servlet>
        <servlet-name>validatecode</servlet-name>
        <servlet-class>webapp.servlet.ValidateCodeServlet</servlet-class>
    </servlet>
   
    <servlet-mapping>
        <servlet-name>validatecode</servlet-name>
        <url-pattern>/images/validatecode.jpeg</url-pattern>
    </servlet-mapping>

servlet类:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import webapp.auth.SessionUtil;     //项目使用自己编写的session处理类

/**
 * 验证码生成servlet
 * @author Administrator
 *
 */
public class ValidateCodeServlet extends HttpServlet {

/**
     *
     */
    private static final long serialVersionUID = 1L;
   
    int w = 60;
    int h = 20;
    int fh = 10;
    int cy = 0;
    int x = 1;
    int cc = 4;

char[] cs = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q'
            ,'R','S','T','U','V','W','X','Y','Z', '2', '3', '4', '5', '6',
            '7', '8', '9'
            };

protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, java.io.IOException {

x = w / (cc + 1);
        fh = h - 2;
        cy = h - 4;

// image buffer
        BufferedImage buffImg = new BufferedImage(w, h,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g = buffImg.createGraphics();

Random random = new Random();

// fill image with white color
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, w, h);

// create font
        Font font = new Font("Fixedsys", Font.PLAIN | Font.BOLD, fh);
        // set font
        g.setFont(font);

g.setColor(Color.blue);
        g.drawRect(0, 0, w - 1, h - 1);

// draw 200 radom line
        g.setColor(Color.gray);
        for (int i = 0; i < 60; i++) {
            int x1 = random.nextInt(w);
            int y1 = random.nextInt(h);
            int x2 = random.nextInt(12);
            int y2 = random.nextInt(12);
            g.drawLine(x1, y1, x1 + x2, y1 + y2);
        }
        // draw radom code
        StringBuffer randomCode = new StringBuffer();
        int red = 0, green = 0, blue = 0;
        for (int i = 0; i < cc; i++) {
            String strRand = String.valueOf(cs[random.nextInt(cs.length - 1)]);
            red = random.nextInt(120);
            green = random.nextInt(60);
            blue = random.nextInt(200);
            g.setColor(new Color(red, green, blue));
            g.drawString(strRand, (i + 1) * x - 6, cy);
            randomCode.append(strRand);
        }
        HttpSession session = req.getSession();
        SessionUtil.set(req, SessionUtil.VALIDATE_CODE_KEY, randomCode
                .toString());
        resp.setHeader("Pragma", "no-cache");
        resp.setHeader("Cache-Control", "no-cache");
        resp.setDateHeader("Expires", 0);
        resp.setContentType("image/jpeg");
        ServletOutputStream sos = resp.getOutputStream();
        ImageIO.write(buffImg, "jpeg", sos);
        sos.close();
    }
}

javax.imageio.IIOException: Can't create output stream! 

javax.imageio.ImageIO.write(ImageIO.java:1521) 
网上搜此问题,有说法是与JDK有关,并给出解决方案:
ImageIO.write(image, "jpeg", response.getOutputStream());
修改为
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());

encoder.encode(image); 
//jsp上要增加com.sun.image.codec.jpeg.JPEGCodec,com.sun.image.codec.jpeg.JPEGImageEncoder这些类的import
经验证,是可以解决问题的。
但是。。。,原因怎会是JDK?我这个环境几分钟前还是正常的,中间没有安装过JDK或者修改环境变量
检查tomcat的日志,终于真相大白:
javax.imageio.IIOException: Can't create output stream!

 at javax.imageio.ImageIO.write(ImageIO.java:1521)

Caused by: javax.imageio.IIOException: Can't create cache file!

 at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:395)  at javax.imageio.ImageIO.write(ImageIO.java:1519)  ... 34 more
Caused by: java.io.IOException: 系统找不到指定的路径。
原来是ImageIO.write(image, "jpeg", response.getOutputStream());
需要写缓冲文件,但是写文件不成功。
回忆几分钟前的操作,可能是删除了tomcat的temp目录。
手动创建temp目录,问题解决!

当然也可以用以下方式解决
ImageIO.write(image, "jpeg", response.getOutputStream());
修改为

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
encoder.encode(image);

javax.imageio.IIOException: Can't create output stream! (生成验证码Servlet)的更多相关文章

  1. 解决javax.imageio.IIOException: Can't create output stream!

    解决javax.imageio.IIOException: Can't create output stream! javax.imageio.ImageIO.write(image, "J ...

  2. 解决tomcat报错javax.imageio.IIOException: Can't create output stream!

    启动tomcat catalina.out报错如下,登陆的时候无法显示验证码 2017-06-09 11:23:06,628 DEBUG org.springframework.web.servlet ...

  3. javax.imageio.IIOException: Can't create cache file!

    javax.imageio.IIOException: Can't create cache file! at javax.imageio.ImageIO.createImageInputStream ...

  4. 网页验证码出不来,读取验证码时出错:javax.imageio.IIOException: Can't create cache file!

    版权声明:本文为博主原创文章,仅作为学习交流使用 转载请注明出处 https://www.cnblogs.com/linck/p/10593053.html 今天打开项目时,发现登陆界面的验证码出不来 ...

  5. 路径名导致的异常:javax.imageio.IIOException: Can't read input file!

    背景: 写了一个测试程序,目的是读取本地的图片,为其打上水印图片.在使用过程中总会遇到:javax.imageio.IIOException: Can't read input file!的错误,最开 ...

  6. javax.imageio.IIOException: Can't read input file!完美解决

    今天遇到一个问题,上图 这段代码主要是给图片添加水印 后来百度发现可能是图片的路径出了问题,因为是动态获取的图片地址,然后我把地址打印出来了 之后通过终端查看,果然没有 之后我在classes目录找到 ...

  7. ArcEngine9.3报错Create output feature class failed

    ArcEngine9.3执行IFeatureDataConverter.ConvertFeatureClass Method出错如下错误信息: Create output feature class ...

  8. javax.validation.ValidationException: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.

    项目依赖 <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifa ...

  9. MessagePack Java Jackson 在不关闭输出流(output stream)的情况下序列化多变量

    com.fasterxml.jackson.databind.ObjectMapper 在默认的情况下在写出输入后将会关闭输出流(output stream). 如果你希望序列化多值变量在同一个输出流 ...

随机推荐

  1. HTTPS、SPDY和HTTP/2的性能比较

    http://www.infoq.com/cn/news/2015/02/https-spdy-http2-comparison/ https://segmentfault.com/a/1190000 ...

  2. Java小实验之数据转换

    看到有人问如图的程序,就去写了几行代码,顺便复习一下条件语句和ASCII码 import java.util.Scanner; public class test1 { public static v ...

  3. 解决ssh登陆过慢问题

    我们经常会遇到的一个情况是telnet到server速度很快,但是ssh连接的时候却很慢,大概要等半分钟甚至更久.ping的速度也非常好,让人误以为是ssh连接不上. 下面说下如何解决这样的问题,最为 ...

  4. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  5. FIFO调度算法和LRU算法

    一.理论 FIFO:先进先出调度算法 LRU:最近最久未使用调度算法 两者都是缓存调度算法,经常用作内存的页面置换算法. 打一个比方,帮助你理解.你有很多的书,比如说10000本.由于你的书实在太多了 ...

  6. 2017-2018-1 20179202《Linux内核原理与分析》第十一周作业

    Metasploit实现木马生成.捆绑.免杀 1.预备知识 (1)Metasploit Metasploit是一款开源的安全漏洞检测工具,全称叫做The Metasploit Framework,简称 ...

  7. Ubuntu18.04 之jdk安装与环境配置

    1.oracle官网下载压缩包. 下载地址为: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  8. 论 异常处理机制中的return关键字

    Java中,执行try-catch-finally语句需要注意: 第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂 ...

  9. Xamarin 2017.11.1更新

     Xamarin 2017.11.1更新 本次更新主要解决了一些bug.Visual Studio 2017升级到15.4.2获得新功能.Visual Studio 2015需要工具-选项-Xamar ...

  10. [ 原创 ]学习笔记-Android 中关于Cursor类的介绍

    此博文转载自:http://www.cnblogs.com/TerryBlog/archive/2010/07/05/1771459.html 主讲Cursor的用法 使用过 SQLite 数据库的童 ...