linux 验证码 权限,linux 上验证码无法显示
当前位置:我的异常网» Linux/Unix » linux 上验证码无法显示
linux 上验证码无法显示
www.myexceptions.net 网友分享于:2015-08-26 浏览:678次
linux 下验证码无法显示
验证码无法显示的问题,验证码的代码就是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)
这里的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();
}
}
}
在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.(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的错误处理,不清楚这里的具体处理,不方便继续追查,作罢。
这个是可能因为awt中用到了一些与平台有关的东西,当在类unix系统下时使用了xwindow的有关内容,你需要启动你的xserver 并且需要对用户开放连接xserver的权限,具体如下
启动xserver
initx
开放权限
xhost +
另外如果系统没有DISPLAY设置的话,还需要export DISPLAY=0
还是不行,再想办法.
package com.genius.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public final class ValidateImage implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//在内存中创建图象
int iWidth = 70, iHeight = 16;
BufferedImage image = new BufferedImage(iWidth, iHeight,
BufferedImage.TYPE_INT_RGB);
//获取图形上下文
Graphics g = image.getGraphics();
//设定背景色
g.setColor(Color.white);
g.fillRect(0, 0, iWidth, iHeight);
//画边框
g.setColor(Color.black);
g.drawRect(0, 0, iWidth - 1, iHeight - 1);
//取随机产生的认证码(4位数字)
String rand = request.getParameter("rand");
rand = rand.substring(0, rand.indexOf("."));
switch (rand.length()) {
case 1:
rand = "000" + rand;
break;
case 2:
rand = "00" + rand;
break;
case 3:
rand = "0" + rand;
break;
default:
rand = rand.substring(0, 4);
break;
}
//将认证码存入SESSION
session.setAttribute("rand", rand);
//将认证码显示到图象中
g.setColor(Color.black);
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
g.drawString(rand, 10, 15);
//随机产生200个干扰点,使图象中的认证码不易被其它程序探测到
Random random = new Random();
for (int iIndex = 0; iIndex < 200; iIndex++) {
int x = random.nextInt(iWidth);
int y = random.nextInt(iHeight);
g.drawLine(x, y, x, y);
}
//图象生效
g.dispose();
//输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
return new ModelAndView();
}
}
解决方案2:我把它修改为
package com.genius.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public final class ValidateImage implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//在内存中创建图象
int iWidth = 70, iHeight = 16;
BufferedImage image = new BufferedImage(iWidth, iHeight,
BufferedImage.TYPE_INT_RGB);
//获取图形上下文
Graphics g = image.getGraphics();
//设定背景色
g.setColor(Color.white);
g.fillRect(0, 0, iWidth, iHeight);
//画边框
g.setColor(Color.black);
g.drawRect(0, 0, iWidth - 1, iHeight - 1);
//取随机产生的认证码(4位数字)
String rand = request.getParameter("rand");
rand = rand.substring(0, rand.indexOf("."));
switch (rand.length()) {
case 1:
rand = "000" + rand;
break;
case 2:
rand = "00" + rand;
break;
case 3:
rand = "0" + rand;
break;
default:
rand = rand.substring(0, 4);
break;
}
//将认证码存入SESSION
session.setAttribute("rand", rand);
//将认证码显示到图象中
g.setColor(Color.black);
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
g.drawString(rand, 10, 15);
//随机产生200个干扰点,使图象中的认证码不易被其它程序探测到
Random random = new Random();
for (int iIndex = 0; iIndex < 200; iIndex++) {
int x = random.nextInt(iWidth);
int y = random.nextInt(iHeight);
g.drawLine(x, y, x, y);
}
//图象生效
g.dispose();
//输出图象到页面
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
encoder.encode(image);
return new ModelAndView();
}
}
修改后成功,,,
当然我们建立一个linux服务器如BBS等。出现验证码不能显示,
解决方案:
1 rpm -qa |grep php-gd 查看是否安装GD库。如果没有则安装GD库rpm -ivh php-gd-*
(*表示GD库的版本,一般这个软件安装光盘中都能找到)。
2 rpm-qa |grep lib-jpeg 查看是否安装这个软件,如果没有安装。则安装这个软件
后话:在linux系统中有很多的问题是因为没有安装对应的包。或者安装的包是错误
版本不一样。如果你的硬盘空间够大建议安装所有的包。
文章评论
linux 验证码 权限,linux 上验证码无法显示相关推荐
- linux suid权限,Linux 学习:文件特殊权限SUID, SGID, SBIT
本次记录Linux特殊权限SUID.SGID.SBIT相关知识及使用实例等. 由于SUID和SGID涉及到系统安全,所以对它们知识点的掌握尤为重要.关于文件权限的表示方法和解析 SUID是Set Us ...
- Linux客户端权限,linux用户与权限使用方法
1.管理用户组说明 RHEL系统中普通用户和组的ID默认从500开始,0~499作为系统保留. 2.命令行管理用户 · 1)使用useradd创建用户 用法:useradd [options] use ...
- linux 666权限,linux主机555、644、666、755、777权限详解
linux主机555.644.666.755.777权限详解 发表时间:2014-06-03 05:07 来源:未知 分类:其它代码 作者:岑溪网站开发 点击:次 linux主机555.644.666 ...
- web 上传文件到linux没权限,Javaweb上传文件到Linux 没有读写权限
一. 问题描述 背景描述: 0.saas-business-运营后台,website-网站页面. 1.javaweb程序(saas-business)部署在linux系统 tomcat服务器下,使用该 ...
- 移动硬盘linux无权限,ubuntu上移动硬盘中文件没有可执行权限的解决方法
ubuntu上移动硬盘中文件没有可执行权限的解决方法,移动硬盘自动挂载到ubuntu上后,移动硬盘中的文件没有可执行权限的解决方法如下: 例如我的移动硬盘卷标为:workspace 当把移动硬盘插入P ...
- linux 760权限,Linux 文件rwx权限问题 chmod 777 XXX 任何人拥有最高权限
在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读.写.运行设定权限. ls -l:得到 -rw-r--r-- 1 apple users 2254 2006-05-20 ...
- linux 压缩权限,linux的基本操作(归档压缩,用户、权限管理,远程服务器构建和vi编辑器)...
linux的压缩归档是这一周最开始学习的一组命令,下面的是我总结的关于压缩归档的知识点 在压缩和归档时,要注意文件的扩展名一定要记得加,还有就是扩展名的格式,要对应好,否者就没法正常的进行. 还学习了 ...
- linux e权限,Linux 文件权限详解
查看文件详细信息 参数说明 权限说明 文件类型说明 d 目录 - 普通文件 l 连接文件 b 存储设备,例如硬盘,U盘 c 串行接口设备,例如键盘.鼠标 设置文件权限 ...
- linux 隐藏权限,Linux权限位,s权限,t权限,及隐藏权限
一.UNIX下关于文件权限的表示方法和解析 UNIX下关于文件权限的表示方法和解析 SUID 是 Set User ID, SGID 是 Set Group ID的意思. UNIX下可以用ls -l ...
- linux idea 权限,Linux下idea由于缺少相关权限导致的tomcat ERROR
昨天一天都在倒腾两个系统,也是醉了. 不过还好,系统修好了,在ubuntu下重新安装idea后,出现了这个错误: Intellij Idea Tmocat Error running Tomcat: ...
最新文章
- js和php获取页面的url信息
- 运行python需要网吗-浏览器运行python脚本吗
- SecureCR 改变背景色和文字颜色
- Delphi 的运算符重载(1)
- Codeforces Round #704 (Div. 2) D. Genius‘s Gambit 构造 + 细节
- 演练 开心庄园 1002
- jquery实现图片等比例缩放,解决max-width在ie中不兼容问题
- WEB中的java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- oracle sqlarea表结构,oracle v$sqlarea 分析SQL语句使用资源情况
- 机器学习基于语义特征的情感分析
- python全栈开发下载_python全栈开发神器 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...
- 中upload依赖包_upload-labs writeup
- 手把手教你架构3D引擎高级篇系列八
- 手写多图片合并成一张图片功能插件(水印合成)
- 什么是跨域?跨域解决方法
- 信息系统项目管理师计算题(期望值)
- [笔记分享] [Display] MIPI屏调试及举例
- Hadoop Notes I
- W: GPG 错误:http://nginx.org/packages/ubuntu bionic InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY ABF5BD827BD9
- 脉冲雷达系统设计与Matlab仿真【附仿真代码】
热门文章
- 推荐一款免费开源的GIF动图软件(录制,编辑,压缩)
- ​​​​尚硅谷—尚医通—前台用户系统—预约挂号—预约下单功能实现(155-160)
- RestTemplate的No instances available for xxx
- 山地车中轴进水表现_求山地自行车各部位上油的方法。特别是中轴和花鼓
- js截取字符串第一个和最后一个字符
- Mybatis Plus分页Page total始终为0
- 基于DCT的信息隐藏
- win8连连看第二季1_第1季
- 73.【JavaWeb-01】
- 网易云登陆界面怎么用PHP做,网易云音乐登录流程图