我的环境配置: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. 浅谈RSA加密

    RSA背景 在1976年以前,传统的加解密过程是: 1.A采用某种手段对数据进行加密. 2.数据传输到B的手中. 3.B逆向的实施A加密采用的步骤. 4.数据被还原. 这就是所谓的对称加密. 解密和加 ...

  2. kotlin 语言入门指南一

    基于官网的Getting Start部分,翻译如下: 基础语法 定义一个包 包的声明必须放在文件头部: package my.demo import java.util.* // ... 不需要加上p ...

  3. 【JS中循环嵌套常见的六大经典例题+六大图形题,你知道哪几个?】

    首先,了解一下循环嵌套的特点:外层循环转一次,内层循环转一圈. 在上一篇随笔中详细介绍了JS中的分支结构和循环结构,我们来简单的回顾一下For循环结构: 1.for循环有三个表达式,分别为: ①定义循 ...

  4. iOS textfield 限制输入字数长度

    iOS textfield限制输入的最大长度 [self.textFiled addTarget:self action:@selector(textFieldDidChange:) forContr ...

  5. javaWeb学习总结(11)- 监听器(Listener)学习

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其 实就是一个实现特定接口的普 ...

  6. Iterator(es6)

    1.任何数据结构只要部署了Iterator接口(本质是一个指针对象),也就是部署了Symbol.iterator属性,便可以完成遍历操作:数组原生就具备Iterator接口,就可以用for...of遍 ...

  7. 外部无法捕捉Realm的doGetAuthenticationInfo方法抛出的异常

    shiro权限框架,用户登录方法的subject.login(token)会进入自定义的UserNamePasswordRealm类的doGetAuthenticationInfo身份验证方法 通常情 ...

  8. docker核心概念及centos6下安装

    Docker三大核心概念 镜像 容器 仓库 镜像 docker镜像类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统. 容器 1.容器是从镜像创建的应用运行实例,容器和 ...

  9. Junit4测试Spring

    使用Junit4.4测试 在类上的配置Annotation  @RunWith(SpringJUnit4ClassRunner.class) 用于配置spring中测试的环境  @ContextCon ...

  10. html或者php中 input框限制只能输入正整数,逻辑与和或运算

    有时需要限制文本框输入内容的类型,本节分享下正则表达式限制文本框只能输入数字.小数点.英文字母.汉字等代码. 例如,输入大于0的正整数 代码如下: <input onkeyup="if ...