关于SSM项目停止Tomcat时Log4j出现java.lang.NoClassDefFoundError:

异常重现

SSM项目集成Log4j日志系统,在tomcat中运行,点击idea的红色停止按钮停止项目时,控制台出现一个关于Log4j的java.lang.NoClassDefFoundError:org/apache/logging/log4j/message/ParameterizedNoReferenceMessageFactory$StatusMessage异常,详细异常信息如下:

Exception in thread "pool-1-thread-1" java.lang.NoClassDefFoundError: org/apache/logging/log4j/message/ParameterizedNoReferenceMessageFactory$StatusMessage
	at org.apache.logging.log4j.message.ParameterizedNoReferenceMessageFactory.newMessage(ParameterizedNoReferenceMessageFactory.java:105)
	at org.apache.logging.log4j.message.AbstractMessageFactory.newMessage(AbstractMessageFactory.java:75)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2010)
	at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1884)
	at org.apache.logging.log4j.spi.AbstractLogger.error(AbstractLogger.java:793)
	at org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry.run(DefaultShutdownCallbackRegistry.java:74)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: Illegal access: this web application instance has been stopped already. Could not load [org.apache.logging.log4j.message.ParameterizedNoReferenceMessageFactory$StatusMessage]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
	at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1343)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1206)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
	... 7 more
Caused by: java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [org.apache.logging.log4j.message.ParameterizedNoReferenceMessageFactory$StatusMessage]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
	at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1353)
	at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1341)
	... 9 more

ycyin大约 2 分钟SpringtomcatSSMLog
SSM集成Shiro自定义权限过滤器不执行解决方案

开发环境

  • IntelliJ IDEA 2019.3 ×64
  • Spring 4.3.3
  • Shiro 1.3.2

问题重现

在Shiro的权限认证后,如果没有权限,系统会跳转到指定的页面,这就需要如下配置:

<!-- 权限认证失败,则跳转到指定页面 -->
<property name="unauthorizedUrl" value="/unauthorized"/>

ycyin大约 5 分钟Web技术&权限SSMShiro
SSM集成Shiro不进入自定义Realm的doGetAuthorizationInfo的解决方案

问题重现

在使用SSM(Spring+SpringMVC+Mybatis)中集成Shiro时,主要使用xml进行配置。一般地,我们就需要自定义Realm,继承AuthorizingRealm重写doGetAuthorizationInfo(权限配置)和doGetAuthenticationInfo(身份验证)方法,和SSM集成时无法进入doGetAuthorizationInfo方法,配置的用户角色权限不生效,导致每一个用户都有访问所有方法。

自定义的Realm类:


ycyin大约 4 分钟Web技术&权限SSMShiro
Vue+SSM中使用Token验证登录

JWT(JSON Web Token)

前后端分离模式下(跨域),传统的Web验证方式大多数情况使用Session。即每一个用户登录后创建一个Session会话,服务端维持这个Session的状态,在这种模式下的最大缺点是,如果没有分布式架构则无法支持横向扩展,并且当用户量大时,服务器负载量太大。

面对上述问题,一种灵活的解决方案就是通过客户端保存数据,而服务器根本不保存会话数据,每个请求都被发送回服务器。 JWT是这种解决方案的代表。 当用户与服务器通信时,客户在请求中发回JSON对象(Token)。服务器仅依赖于这个JSON对象来标识用户。为了防止用户篡改数据,服务器将在生成对象时添加签名。服务器不保存任何会话数据,即服务器变为无状态,使其更容易扩展。


ycyin大约 3 分钟SpringVueSSMJWT