我的环境配置:RHEL6.5+tomcat6+jdk1.6

今天遇到一个奇怪的现象,我的tomcat启动起来之后,网站无法显示验证码,导致无法登陆。我的tomcat启动过程是这样的:

我有一个进程守护的程序monitor,当开机的时候用自启动脚本的方式启动monitor,然后monitor检测tomcat进程是否启动如果没有启动,就将tomcat进程启动起来。

流程如下图所示:

使用这样的方式启动的tomcat无法显示验证码。F12打开调试器出现了错误

<html><head><title>Apache Tomcat/6.0.20 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server encountered an internal error () that prevented it from fulfilling this request.</u></p><p><b>exception</b> <pre>
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/ImageFormatException
org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1259)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
main.com.ieslab.util.XSSFilter.doFilter(XSSFilter.java:24)
main.com.ieslab.util.AccessControlFilter.doFilter(AccessControlFilter.java:72)
org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(Delegatin

网上说法:封装了验证码生成的类使用JPEGCodec类生成验证码的图片。​而图像处理JPEGCodec类已经从Jdk1.7移除。需要用ImageIO.write重写,原文链接:https://my.oschina.net/zb0423/blog/86507

我用的是jdk1.6,所以我的错误不应该是JPEGCodec类引起的,然后抱着试试看的态度用ImageIO.write重写,可验证码还是无法显示。

更加奇怪的是,我手动从终端执行./catalina.sh run启动动的tomcat却能显示验证码。倒腾了一上午还是没有解决问题,最后我用非root用户执行./catalina.sh run,问题重现:验证码无法显示。恍然大悟,应该是权限问题导致的,马上做实验。我先用root账户登录,执行./catalina.sh run,验证码能显示。然后用非root用户user01登录,执行./catalina.sh run,验证码就无法显示了。

问题的原因已经找到:tomcat进程没有用root用户启动,用ps命令查看了一下tomcat进程,确实不是root用户。

[user01@RHEL6 ~]$ ps -ef |grep java | grep -v grep | grep tomcat
user01 1857 1 89 14:16 ? 00:00:22 /usr/bin/java -Djava.util.logging.config.file=/usr/appsoft/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/appsoft/tomcat/endorsed -classpath :/usr/appsoft/tomcat/bin/bootstrap.jar -Dcatalina.base=/usr/appsoft/tomcat -Dcatalina.home=/usr/appsoft/tomcat -Djava.io.tmpdir=/usr/appsoft/tomcat/temp -Djava.awt.headless=true org.apache.catalina.startup.Bootstrap start
user01 1931 1 99 14:16 ? 00:00:09 /usr/bin/java -Djava.util.logging.config.file=/usr/appsoft/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/appsoft/tomcat/endorsed -classpath :/usr/appsoft/tomcat/bin/bootstrap.jar -Dcatalina.base=/usr/appsoft/tomcat -Dcatalina.home=/usr/appsoft/tomcat -Djava.io.tmpdir=/usr/appsoft/tomcat/temp -Djava.awt.headless=true org.apache.catalina.startup.Bootstrap start

那如何让自启动的程序是以root用户启动的呢?

其实很简单将自启动脚本的属主改为root用户,赋予可执行权限,并创建自启动脚本链接

#chown -R root:root /sbin/mystart
#chmod +x /sbin/mystart
#ln -s /sbin/iesstart /etc/rc5.d/S999mystart

其中mystart为我的自启动脚本文件。这样问题得以解决!!!


可能的原因二:

当使用ps -ef |grep java | grep -v grep | grep tomcat查看没有显示验证码的tomcat进程时,可以看出此时使用的java路径为/usr/bin/java,这个java为系统自带的。

当查看正常显示的tomcat进程时,此时使用的java为/usr/appsoft/jdk1.6.0_45/jre/bin/java,这个路径为自己安装的java路径。

因此可以分析出验证码无法显示是因为使用了系统自带的java,因此将系统自带的java卸载即可。

linux+tomcat+jdk环境验证码无法显示的更多相关文章

  1. linux下jdk环境变量配置深度分析----解决环境变量不生效的问题

    1.linux下jdk环境变量配置 是否需要配置环境变量,主要看java -version 显示的版本是否为你期望的版本 1.1 不需要配置环境变量的情况 使用java -version查看,版本显示 ...

  2. hadoop搭建杂记:Linux下JDK环境变量的设置(三种配置环境变量的方法)

    Linux下JDK环境变量的设置(三种配置环境变量的方法) Linux下JDK环境变量的设置(三种配置环境变量的方法) ①修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种 ...

  3. 在linux上使用tomcat服务器图片验证码不显示问题

    背景描述:在liunx系统上,使用tomcat中间件,访问web项目,登录页面的图片验证码显示不出来,但是在window系统上可以正常显示 解决方案:设置一下这个文件tomcat/bin/catali ...

  4. Linux lamp环境验证码无法显示

    2018-12-19 php验证码无法在前端显示 原因: 缺少gd库 解决办法: CentOS / RedHat / Fedora系统 sudo yum install php-gd -y Debia ...

  5. Tomcat+jdk 环境处理 java jsp代码编写web环境的容器

    Tomcat是由 Apache 软件基金会下属的 Jakarta 项目开发的一个Servlet 容器,按照 SunMicrosystems 提供的技术规范,实现了对 Servlet 和 JavaSer ...

  6. Windows/Linux下jdk环境配置

    Windows 7下: Windows7 x64位系统 安装好java 1.点击开始菜单选择计算机选项右键选择属性选项 即可 2.然后在属性界面点击如图所示的高级系统设置选项 3.打开系统属性界面然后 ...

  7. linux配置jdk环境详解

    环境:Redhat Server 5.1(虚拟机) 工具:Xftp4  jdk-7-linux-i586.rpm文件 步骤1:把jdk-7-linux-i586.rpm文件拷贝到/usr/local目 ...

  8. linux配置jdk环境变量

    首先在Linux解压后缀为.tar.gz的jdk压缩文件 解压到当前的文件夹 tar -zcvf /root/java/jdk版本编号 指令: cd 目录路径     -> 是进入该目录路径 c ...

  9. 转 linux安装jdk环境(多种方式)

    linux系统通用安装通过tar.gz压缩包安装此方法适用于绝大部分的linux系统 1.先下载tar.gz的压缩包,这里使用官网下载. 进入: http://www.oracle.com/techn ...

随机推荐

  1. web 直播&即时聊天------阿里云、融云

    随着直播越来越火,所在公司也打算制作自己的直播,所以去了解了这方面,使用后发现还是有些问题需要记录的. 经过分析,制作直播应该是分为两块来做,即直播与实时评论.这里先去制作实时评论,等直播ok后,也会 ...

  2. My-Blog搭建过程:如何让一个网站从零到可以上线访问

    文章简述 5月13号的时候,上线了自己的个人博客网站:http://blog.hanshuai.xin,随后在平台上发布了一篇关于My-Blog的介绍博客<Docker+SpringBoot+M ...

  3. java集合(3)- Java中的equals和hashCode方法详解

    参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...

  4. Java反射机制详解(1) -反射定义

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

  5. SparkMLlib学习之线性回归

    SparkMLlib学习之线性回归 (一)回归的概念 1,回归与分类的区别 分类模型处理表示类别的离散变量,而回归模型则处理可以取任意实数的目标变量.但是二者基本的原则类似,都是通过确定一个模型,将输 ...

  6. nrm是什么?以及nrm的安装与命令

    nrm的作用与安装使用 一.nrm是什么? 这是官方的原话: 开发的npm registry 管理工具 nrm, 能够查看和切换当前使用的registry, 最近NPM经常 down 掉, 这个还是很 ...

  7. js实现谷歌坐标转百度坐标

    js实现谷歌坐标转百度坐标 谷歌坐标转百度坐标 实现算法如下(以js为例,其他语言调整就行): //$lat 维度:$lng 经度  function GCJTobaidu($lat, $lng){ ...

  8. 教你怎么把iconfont转换成png透明图片

    1.进入iconfont图标库,登陆.http://www.iconfont.cn/ 2.选择想要的图标加入购物车. 3.直接选中下载图标为png格式.

  9. Qt之添加图标

    导读: 在使用Qt Creator编写完应用程序后,设置release版的应用程序图标着实困扰了不少的人.一个漂亮的图标是一个软件的脸,没有一个漂亮的图标,那么这个程序是不完整的.那么我们来看看如何设 ...

  10. Java数据库连接错误集

    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after co ...