- 浏览: 413925 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (184)
- IDE (4)
- dotCMS (3)
- Liferay Portal (1)
- J2EE (7)
- My SQL (16)
- IBM DB2 (3)
- Oracle (2)
- JDBC (4)
- Hibernate (3)
- JSP (0)
- Framework (4)
- Java编程 (30)
- C++编程 (0)
- Struts 1.X (2)
- Struts 2.X (6)
- Linux (11)
- Spring (7)
- JavaScript (6)
- Ajax (2)
- XML (3)
- IBM Websphere Portal (1)
- IBM Lotus Quickr (1)
- CMS (2)
- ERP (0)
- CRM (0)
- 大型网站架构开发 (1)
- 面试武器 (2)
- HTML 5 (2)
- dTree && webFxloadTree (2)
- JVM (7)
- SQL Server (3)
- Tomcat && Apache && Jboss && Weblogic-中间件 (4)
- FreeMarker (2)
- MongoDB (7)
- OpenSource开源 (24)
- Cloud (0)
- FFmpeg (3)
- Thrift (1)
- SpringSide (1)
- Design Pattern (1)
- solr&&ES (2)
- git&svn (1)
- 大数据 (8)
- 人工智能 (0)
- Hadoop (3)
- Spark (0)
- Sqoop (1)
- Flume (1)
- Hive (3)
- HDFS (4)
- ES (0)
- Redis (1)
- Kafka (3)
- MR (0)
- 机器学习 (0)
- 深度学习 (0)
- Impala (2)
- HBase (2)
- Spring Boot (1)
- Spring Cloud (0)
- 大数据架构 (6)
- 架构思想理论 (6)
- 技术管理 (4)
- 数据结构与算法 (4)
最新评论
-
huijz:
...
Spring Data JPA研究-使用Spring Data JPA 简化JPA 开发(ZZ) -
用户名不存在:
[img][/img][*]引用[u][/u][i][/i][ ...
MongoDB 模糊查询的三种实现方式-morphia实现 -
junsheng100:
请给个完整的例子吧!包括jar文件等
java调用ffmpeg获取视频文件信息参数代码 -
mj:
谢谢!!
SQL Server里面如何导出包含(insert into)数据的SQL脚本 (转载ZZ)
最近公司项目开发中遇到的一个问题,整理一下,和大家分享。
验证码无法显示的问题,验证码的代码就是google上查找到的最常见的代码,服务器采用resin部署于linux或unix。不是常见的out.clear()问题,这次的问题发现在一个我压根就没有想到的地方,profile DISPLAY 环境变量。
1) 问题描述:
登录页面等有验证玛显示的页面,通常可以正确显示验证码图片,但是在某些情况下发现验证码图片无法显示,并且目前只发生在linux/unix平台,windows下正常.而且和resin/jdk版本无关.
bug的直接表现是表现为ie下是红叉,firefox下无实现.将验证码图片的地址在ie输入框中输入,则页面报错:
- 500 Servlet Exception
- java.lang.NoClassDefFoundError
- at java.lang.Class.forName0(Native Method)
- at java.lang.Class.forName(Class.java:164)
- at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68)
- at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1141)
- at com.asiainfo.aimc.wmail.action.CreateImageServlet.doGet(CreateImageServlet.java:104)
500 Servlet Exception java.lang.NoClassDefFoundError at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:164) at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68) at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1141) at com.asiainfo.aimc.wmail.action.CreateImageServlet.doGet(CreateImageServlet.java:104)
这里的java.lang.NoClassDefFoundError 极其误导人,一直以为是CLASSPATH或者jar包的问题,所以反复检查resin和jdk版本。
始终无法找到问题,只好尝试追查jdk源码,看到底发生了什么。
2) jdk源码追查
调用的servlet:
BufferedImage bi = new BufferedImage(...)
Graphics2D g = bi.createGraphics();
查jdk: BufferedImage.createGraphics():
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
再查GraphicsEnvironment.getLocalGraphicsEnvironment:
String nm = (String) java.security.AccessController.doPrivileged
(new sun.security.action.GetPropertyAction
("java.awt.graphicsenv", null));
......
localEnv = GraphicsEnvironment) Class.forName(nm).newInstance();
......
问题应该和nm有关,这里明显是一个类似工厂模式的设计,"java.awt.graphicsenv"到nm 然后Class.forName() 生成GraphicsEnvironment对象。
由于代码在jdk中,不方便修改,因此单独将这些代码提出来到简单的测试类 Test.java:
3) 测试代码分析
- public class Test {
- public static void main(String[] args) {
- String nm = (String) java.security.AccessController.doPrivileged
- (new sun.security.action.GetPropertyAction
- ("java.awt.graphicsenv", null));
- System.out.println(nm);
- try {
- Class.forName(nm).newInstance();
- } catch (Throwable e) {
- System.out.println("error=" + e.getClass().getName());
- e.printStackTrace();
- }
- }
- }
public class Test { public static void main(String[] args) { String nm = (String) java.security.AccessController.doPrivileged (new sun.security.action.GetPropertyAction ("java.awt.graphicsenv", null)); System.out.println(nm); try { Class.forName(nm).newInstance(); } catch (Throwable e) { System.out.println("error=" + e.getClass().getName()); e.printStackTrace(); } } }
在windows平台下运行,结果正常,打印:
sun.awt.Win32GraphicsEnvironment
将代码放到出问题的resin安装所在的linux平台,手工编译运行:
javac Test.java
java -cp . Test
报错,打印为:
- sun.awt.X11GraphicsEnvironment
- Throwable=java.lang.InternalError
- java.lang.InternalError: Can't connect to X11 window server using '10.3.18.16' as the value of the DISPLAY variable.
- at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
- at sun.awt.X11GraphicsEnvironment.access$000(X11GraphicsEnvironment.java:53)
- at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:142)
- at java.security.AccessController.doPrivileged(Native Method)
- at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:131)
- at java.lang.Class.forName0(Native Method)
- at java.lang.Class.forName(Class.java:164)
- at Test.main(Test.java:13)
sun.awt.X11GraphicsEnvironment Throwable=java.lang.InternalError java.lang.InternalError: Can't connect to X11 window server using '10.3.18.16' as the value of the DISPLAY variable. at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method) at sun.awt.X11GraphicsEnvironment.access$000(X11GraphicsEnvironment.java:53) at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:142) at java.security.AccessController.doPrivileged(Native Method) at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:131) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:164) at Test.main(Test.java:13)
从错误信息" Can't connect to X11 window server using '10.3.18.16' as the value of the DISPLAY variable."来看,和DISPLAY环境变量有关
执行unset再运行可以发现问题消失:
$> unset DISPLAY
$> java -cp . Test
sun.awt.X11GraphicsEnvironment
$>
在此情况下(unset DISPLAY )下重新启动resin,发现验证码可以正常显示。
4) 解决的方法:
必须保证resin运行时DISPLAY 环境变量没有设置,如果resin运行的环境有其他要求必须使用DISPLAY,则可以在运行resin前使用unset清除. 建议的简单而有效的方法是直接修改resin/bin/httpd.sh文件,在第二行(具体行数无所谓,但必须在最后一行前)插入:
#! /bin/sh
unset DISPLAY
#....
5)疑惑
1. Can't connect to X11 window server using '10.3.18.16' as the value of the DISPLAY variable
为什么要去连X11 window server ?不懂
2. 从Test.java运行看抛出的是Error : java.lang.InternalError,但是页面上显示的是java.lang.NoClassDefFoundError,看了看源代码也没有发现先catch 后throws的错误处理,不清楚这里的具体处理,不方便继续追查,作罢。
方案二:
Linux环境下对java图片类的支持不够,需要添加如下配置、方可加载图片环境:(或置于/etc下profile 配置文件中 /etc/profile文件)
tomcat下bin的启动文件,startup.sh中修改添加如下: export CATALINA_OPTS="-Djava.awt.headless=true"即可。
发表评论
-
Linux常用命令总结
2022-02-10 17:59 219Linux常用命令总结 find命令: fin ... -
Shell条件判断语句if中-a至-z的意思
2018-12-29 18:41 746Shell条件判断if中的-a到-z的意思 [ - ... -
Linux vim命令详解
2017-12-18 15:44 792Linux vi和vim都是Linux ... -
java.io.IOException: Too many open files解决方案
2013-03-06 15:35 11689异常:java.io.IOException: Too m ... -
centOS 4 文件名称显示中文以及解决SecureCRT 中文显示乱码问题
2011-04-02 17:26 19701、 修改 /etc/sysconfig/i18n 内 ... -
Linux命令(一)
2011-04-02 17:04 1191删除日志: df -ah du -sh * find ... -
Linux中JDK 的卸载和安装
2011-04-02 16:47 739一.jdk1.4卸载 由于redhat Enterprise ... -
Linux下MySQL 的卸载和安装
2011-04-02 11:18 1343介绍一下mysq的安装 一、前期准备: 1.由 ... -
find命令查找包含指定内容的文件
2011-03-30 15:48 4356find .|xargs grep xfind . -exec ... -
Linux CentOS+jdk+tomcat+mysql && CentOS Web应用乱码问题
2011-01-12 15:40 17811.安装Linux CentOS 用的盘是公司的,版 ...
相关推荐
Linux/UNIX系统编程手册源码 linux interface source code
Linux/UNIX系统编程手册课后习题代码 linux-programming-interface-exercises
,linux编程.ppt,linux编程.ppt,linux编程.ppt,linux编程.ppt,linux编程.ppt,linux编程.ppt,linux编程.ppt,linux编程.ppt,linux编程.ppt
用Linux/UNIX Shell编程语言设计系统监控程序.pdf
经典之作《Linux/UNIX系统编程手册》源码,比书中源码要新。直接解压可编译。
python3.7,官网原版,适合linux/unix平台,放心使用。
《LINUX/UNIX系统编程手册 上》.((德)Michael Kerrisk ),经典的linux/unix下c语言编程手册,分上下册,每册有150M,由于上传权限,是能把每册分割成3份上传
该资源是很好的学习Linux/Unix编程的手册,看豆瓣书评挺高的就先自己下载看一下,防止自己的文件意外删除,先放到CSDN上,一来可以做一个备份,二来有需要的也可以自己下载(分享才能更好的成长)
有两本书组成,一本是可以快速上手操作linux/unix系统的简介教程,另一本时比较详细的慢慢研究的经典教程(鸟哥的私房菜+高清),值得收藏
《linux/unix系统编程手册(上、下册)》是介绍linux与unix编程接口的权威著作。linux编程资深专家michael kerrisk在书中详细描述了linux/unix系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。...
《Linux/UNIX系统编程手册(上、下册)》是介绍Linux与UNIX编程接口的权威著作。Linux编程资深专家Michael Kerrisk在书中详细描述了Linux/UNIX系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。...
《Linux/UNIX系统编程手册(上、下册)》是介绍Linux与UNIX编程接口的权威著作。Linux编程资深专家Michael Kerrisk在书中详细描述了Linux/UNIX系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。...
Linux/UNIX系统编程手册源代码(来自官方网站),代码在Linux发行版上可以编译运行,执行make命令即可。
《linux/unix系统编程手册(上、下册)》是介绍linux与unix编程接口的权威著作。linux编程资深专家michael kerrisk在书中详细描述了linux/unix系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。...
《Linux/UNIX网络编程》-甘刚-电子教案
LDAP是一种非关系型数据库,支持读取数据的速度远胜于老牌的mysql
linux/unix系统编程手册附录代码,适用于想提高自己linu水平以及对linux感兴趣的的同学去参考阅读
Linux与UNIX+Shell编程指南
Linux与unix+shell编程指南、Linux与unix+shell编程指南
Linux/Unix自动运维工具expect5.45+Tcl安装包,包括使用说明及范例,欢迎下载使用!