`

验证码不显示imageio异常

 
阅读更多

今天遇到一个问题,部署环境时验证码不出来,一直报image的io异常:

解决1:换一种输出方式

<%@ page language="java" contentType="image/jpeg" pageEncoding="GBK"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.awt.image.*"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.imageio.*"%>
<%@ page import="com.sun.image.codec.jpeg.JPEGCodec,com.sun.image.codec.jpeg.JPEGImageEncoder"%>

<html>
<body>
<%!
 Color getRandColor(int fc,int bc){
	Random random=new Random();
	if(fc>255)fc=255;
	if(bc>255)bc=255;
	int r=fc+random.nextInt(bc-fc);
	int g=fc+random.nextInt(bc-fc);
	int b=fc+random.nextInt(bc-fc);  
	return new Color(r,g,b);
}
%>
<%
int width=60,height=20;
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
Random random=new Random();
g.setColor(getRandColor(200,250));
g.fillRect(0,0,width,height);
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.setColor(getRandColor(160,200));
for(int i=0;i<155;i++){
	int x=random.nextInt(width);
	int y=random.nextInt(height);
	int x1=random.nextInt(12);
	int y1=random.nextInt(12);
	g.drawLine(x,y,x+x1,y+y1);
}
//get the random number
String sRand="";
for(int i=0;i<4;i++){
	String rand=String.valueOf(random.nextInt(10));
	sRand+=rand;
	g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
	g.drawString(rand,13*i+6,16);
}
//put the checkNumber into session
session.setAttribute("verify_code",sRand);
response.reset(); //如果不加此句,在weblogic下,验证码不显示。
g.dispose();
// ImageIO.write(image,"JPEG",response.getOutputStream()); 
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
encoder.encode(image); 

%>

</body>
</html>

 

解决2:在tomcat里目录下加一个temp文件夹

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());

需要写缓冲文件,但是写文件不成功。

手动创建temp目录,问题解决!

 

分享到:
评论

相关推荐

    验证码工具类.zip

    用户提交表单时,Struts2会调用预先配置的验证码验证拦截器,比较session中的验证码值与用户输入,若不匹配则抛出异常或返回错误信息。 ### 其他相关知识点 1. **.jar包**: 提供的.jar包可能包含了验证码生成所...

    java强大的动态验证码

    前端页面通常会通过JavaScript异步请求后端接口来获取验证码图片,并显示在页面上。例如,可以使用AJAX或fetch API等方式发起GET请求。 ```javascript fetch('/verify/makeVerifyCode', { method: 'GET' }) .then...

    Java使用SSM框架实现登录页面的验证码功能

    - **比较验证码**:对用户输入的验证码和session中的验证码进行比较,注意大小写不敏感。 #### 总结 以上就是使用SSM框架实现登录页面验证码功能的完整过程。这种方法简单且易于实现,同时也能够有效提高网站的...

    jsp 生成验证码代码

    7. 输出验证码图像:将BufferedImage对象通过ImageIO.write方法输出到客户端。 知识点四:验证码的存储与验证 在本例中,生成的验证码字符串被存储在session中。在用户提交表单后,需要在后端代码中(例如check.jsp...

    java验证码技术

    这里将请求发送到服务器上的`CheckCode`处理程序,生成验证码图片并将其显示在页面上。 #### 四、安全性与优化建议 - **提高安全性**:可以考虑增加图形扭曲、噪点等元素来提高识别难度。 - **扩展验证码类型**:...

    在JSP中显示servlet中生成的或读取的图片

    在JSP中显示Servlet生成或读取的图片是一项常见的任务,尤其在动态网站开发中,例如用户上传的图片处理、验证码生成等场景。本篇将详细介绍如何实现这一功能,涉及的知识点包括Java Servlet、JSP、HTTP协议以及文件I...

    PictureCheckCode.zip_zip

    6. **异常处理**:为了确保程序的健壮性,`PictureCheckCode`可能会包含异常处理机制,以处理可能出现的错误情况,如文件不存在、内存不足等问题。 7. **单元测试**:为了确保代码的正确性,开发者可能还编写了单元...

    java-swing 简单的登录注册

    这可能涉及到Java的`java.awt`和`javax.imageio`包,用于创建和操作图像。 - 用户点击验证码图片可以刷新验证码,这可能通过重置验证码字符串并重新绘制图像来实现。 4. **事件监听**: - Swing中的组件可以通过...

    java备忘录编写源代码及运行界面截图.doc

    \n - 验证码的刷新功能通过监听器`jl4.addMouseListener(new addEvent())`实现,用户可以点击“看不清”标签来更换验证码。\n\n3. **界面布局**\n - 采用`null`布局,允许精确控制组件的位置和大小。这种方式虽然...

    JSP登录验证页面(doc)

    - 设置默认错误页为空,这通常意味着任何异常都将在当前页面处理。 2. **登录逻辑**: - 通过`request.getParameter`方法获取用户提交的用户名和密码。 - 为了简化示例,这里没有显示具体的登录验证逻辑,但在...

    java-备忘录编写源代码及运行界面截图.doc

    - 为“瞧不清”标签添加鼠标监听器,以便用户可以刷新验证码。 ### 6. 文件操作 - **读取文件中的图像资源:** - 使用`File`类表示文件路径。 - 使用异常处理确保文件读取过程中出现错误时能够正常处理。 ### ...

    java-Browser模拟器登录12315

    在IT行业中,Java-...在实际应用中,还需要考虑异常处理、等待元素加载、动态加载内容的处理以及如何处理登录后的会话保持等问题。同时,为了遵守网站的使用协议和避免被封IP,应确保合理、合法地进行自动化操作。

Global site tag (gtag.js) - Google Analytics