权限框架用的shiro,部署到contos7的tomcat77.0.54下,之前该tomcat下已经有几个项目,基本上用的是一个框架,都运行正常好好的,但新部署的项目就是登录不进,看日志,权限认证已经通过,但就是不跳转主页面,验证成功之后又跳回到了登录页面,而登录页面也不显示任何登录失败的消息,看控制台日志,一堆如下的东西:
Nov 27, 2017 9:54:44 PM org.apache.catalina.startup.ContextConfig processAnnotationsJar
SEVERE: Unable to process Jar entry [javassist/ClassClassPath.class] from Jar [jar:file:/usr/share/tomcat/webapps/OES2/WEB-INF/lib/javassist-3.20.0-GA.jar!/] for annotations
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
at org.apache.tomcat.util.bcel.classfile.Utility.swallowMethodParameters(Utility.java:797)
at org.apache.tomcat.util.bcel.classfile.Attribute.readAttribute(Attribute.java:171)
at org.apache.tomcat.util.bcel.classfile.FieldOrMethod.
at org.apache.tomcat.util.bcel.classfile.Method.
at org.apache.tomcat.util.bcel.classfile.ClassParser.readMethods(ClassParser.java:267)
at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:127)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2058)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1934)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1900)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1885)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1317)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:876)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:374)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5355)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.startup.HostConfig.reload(HostConfig.java:1487)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1465)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1649)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:328)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1374)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
at java.lang.Thread.run(Thread.java:745)
以及如下的信息:
Nov 27, 2017 9:54:44 PM org.apache.catalina.startup.ContextConfig processAnnotationsJar
SEVERE: Unable to process Jar entry [javassist/ClassPool.class] from Jar [jar:file:/usr/share/tomcat/webappsZhengZhou/OES2/WEB-INF/lib/javassist-3.20.0-GA.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid constant pool reference: 2817. Constant pool size is: 528
at org.apache.tomcat.util.bcel.classfile.ConstantPool.getConstant(ConstantPool.java:183)
at org.apache.tomcat.util.bcel.classfile.ConstantPool.getConstant(ConstantPool.java:202)
at org.apache.tomcat.util.bcel.classfile.Attribute.readAttribute(Attribute.java:94)
at org.apache.tomcat.util.bcel.classfile.FieldOrMethod.
at org.apache.tomcat.util.bcel.classfile.Method.
at org.apache.tomcat.util.bcel.classfile.ClassParser.readMethods(ClassParser.java:267)
at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:127)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2058)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1934)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1900)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1885)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1317)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:876)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:374)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5355)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.startup.HostConfig.reload(HostConfig.java:1487)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1465)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1649)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:328)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1374)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
at java.lang.Thread.run(Thread.java:745)
之前服务器上部署过一个项目似乎也出现过这种情况,也是控制台出这种错误,后来忘记是怎么操作又好了的,可以登录了,可是会出现一会儿能登录一会儿不能登录,重启一控下就可以了,制台日志里仍有这种错误,想了各种方法都无法解决,也忘记都做什么操作了,重下载包啊,清缓存啊,清工作目录啊,解决冲突啊,凡此种种,后来忽然间就好了,具体原因不清楚,因为太忙,也就不了了之了。
这次又碰到这种问题,初始一见这个错误就觉得跟它没多大关系,就没往这边考虑,可问题是除此之外系统没任何错误,连登录页面的登录失败提示也没有。后来百度来百度去,有人提到JDK版本相关的问题,于是考虑到服务器上JDK为1.7,本机是1.8+1.7,是不是编译的问题?于是将所有文件重新用1.7编译一遍,再放服务器还是不行,但是不知道是好是坏的,原来本机在eclipse下运行一下没有任何问题,所以无法调试,经过一翻折腾,本机终于也出现同样的问题了。
于是根据服务器日志上输出的最后一条信息,找到相对应的语句,是自定义的shiro的realm文件,里面最后一句:
SimpleAuthenticationInfo saci = new SimpleAuthenticationInfo(user, user.getPassword(), getName());
logger.info("【" + user.getName() + "(" + user.getLoginname() + ")" + "】登录系统");
return saci;
Shiro Configuration
/login.action = authc
/logout.action = logout
/static/** = anon
/login!getVerifyCode.action = anon
/login!reGetVerifyCode.action = anon
/login!checkVerifyCode.action = anon
/login!getImageCode.action = anon
/login!checkImageCode.action = anon
/httpservice/**=anon
/app/**=anon
/web/**=anon
/errorpage/**=anon
/** = authc
考虑到自己eclipse下原本正常,而所有动作不过就是重新编译,于是把自己定义的包,项目包重新拿1.8进行编译,然后,本机居然好了。然后又重新恢复到1.7,居然也是好的。说到这儿我不得不怀疑eclipse是有bug的,我怀疑它在做某些编译的时候,并没有全部编译文件,即使我们项目执行了clean,maven clean,甚至将jdk版本换掉,总之,项目原来正常时我使用的编译环境,后来登录不进的时候的编译环境,以及后来又正常后的编译环境,其实都是一种环境,就是jdk7。当然,之所以会有不正常,我也怀疑跟我本机上装了两个版本的jdk,而系统指向的JAVA_HOME是1.8有一定的关系。
可本机好了,服务器上仍是不行,具体原因仍不详。
新来的小同事帮忙测试,干脆在服务器上又装上了tomcat8(原来是tomcat7),也是不行,再干脆,在服务器上装上了jdk8(原来是openjdk1.7),tomcat8指向jdk8,然后就可以了!!!
考虑到以后项目用jdk8居多,再说又是向下兼容,干脆让小同事将原来的tomcat也指向到1.8,然后,一切都解决了。
最终的解决方案是,换了服务器上的jdk。
最终得出的结论是:编译环境的问题。
供大家参考。