在  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. 如何在k8s集群里快速运行一个镜像?

    在docker里,快速run一个镜像,很简单的. k8s的世界,与之类似. 但要注意一下,如果镜像本身没有提供command命令,这个容器由于前台输出完成,很快就退出了. 所以,遇到这种镜像,就最好自 ...

  2. win7下docker环境搭建nginx+php-fpm+easyswoole+lavarel+mysql开发环境

    win7环境基础在上一篇win7下docker环境搭建nginx+php-fpm+easyswoole开发环境中已经详细叙述搭建完成 本篇文章将叙述如何在上述基础上搭建laravel开发环境,这个其实 ...

  3. 常见的mysql数据库sql语句的编写和运行结果

    省份城市试题#省份表    -> select * from province;+----+----------+| id | province |+----+----------+|  1 | ...

  4. Git 简史

    同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代.Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991 ...

  5. 【java】Hibernate saveOrUpdate失效以及补救方案

    有个需求是如果unique key不存在则插入,存在则更新. 简单的方式先select一下再insert 或者update,但是嫌太麻烦而且慢,所以采用Hibernate中session.saveOr ...

  6. 日报 18/07/15 Java 性能优化

    尽量指定类和方法的final修饰符 带有final修饰符的类是不可派生的 在java核心api中 有许多应用final的例子 例如 java.lang.string整个类都是final的 为类指定fi ...

  7. [python]源码-对象的创建和行为

    (明天论文就要送审了!!!距离毕业一个月!!!) 现在还记得刚开始学python时候被这种动态语言惊到的那种感觉,列表和字典对象可以随意伸缩,简直不能更帅了,但是一直不知道内部到底是怎么实现的,pyt ...

  8. Ubuntu 16.04 64位 tftp服务器搭建

    TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务 ...

  9. [BZOJ4557][JLOI2016]侦察守卫(树形DP)

    首先可以确定是树形DP,但这里存在跨子树的信息传递问题,这里就需要“借”的思想. f[i][j]表示i子树内所有点都被覆盖到,且i以外j层内的点都能被覆盖到 的方案数. g[i][j]表示i子树内离i ...

  10. Kibana安装及使用说明

    Kibana安装及使用说明 Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据. 官方地址:https://www. ...