龙空技术网

struts2.3升级到2.5终极版

青春换季 222

前言:

今天朋友们对“apache struts版本查看”大致比较注意,朋友们都需要分析一些“apache struts版本查看”的相关知识。那么小编在网上网罗了一些有关“apache struts版本查看””的相关知识,希望姐妹们能喜欢,朋友们一起来了解一下吧!

最近struts2出现漏洞,攻击者可以远程执行代码命令,上传木马文件至服务器,获取服务器控制权限等, 公司老项目用的是2.3版本的,目前要升级到2.5保证项目不被攻击,专门研究了一周左右终于升级成功了。修补建议 官方已发布了安全补丁,建议将struts2.3升级到 2.5 或以上。 下载struts2.5.30依赖包

Index of /dist/struts/2.5.30

下载struts-2.5.30-min-lib.zip 这个文件

解压后文件如下:

删除log4j-api-2.12.4.jar文件中的META-INF\versions\9META-INF\versions\9\module-info.class文件,不删启动会报错。

解压后的jar文件拷贝到工程中的WEB-INF/lib目录中.

在WEB-INF/lib目录中删除旧的jar文件,jar文件如下:

下载log4j2.12.1

struts2.5.30需要apache-log4j-2.12.1版本。

下载地址:

解压后的文件log4j-core-2.12.1.jar拷贝到WEB-INF/lib目录中.

所有替换完的jar包结构如下:

拷入配置文件:log4j2.component.properties

log4j2.component.properties文件拷贝到src\main\resources目录

文件内容如下:

log4j2.loggerContextFactory=org.apache.logging.log4j.core.impl.Log4jContextFactory

log4j.configurationFile=log4j2.xml

拷入配置文件:log4j2.xml

log4j2.xml文件拷贝到src\main\resources目录

文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ";>

<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->

<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->

<configuration status="TRACE" monitorInterval="300">

<!--先定义所有的appender -->

<appenders>

<!--这个输出控制台的配置 -->

<console name="Console" target="SYSTEM_OUT">

<!--输出日志的格式 -->

<PatternLayout

pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />

</console>

<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->

<File name="log" fileName="=D:/GENDMS_FILE/logs/test.log" append="false">

<PatternLayout

pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />

</File>

<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->

<RollingFile name="RollingFileInfo"

fileName="D:/GENDMS_FILE/logs/info.log"

filePattern="D:/GENDMS_FILE/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">

<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->

<ThresholdFilter level="info" onMatch="ACCEPT"

onMismatch="DENY" />

<PatternLayout

pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />

<Policies>

<TimeBasedTriggeringPolicy />

<SizeBasedTriggeringPolicy size="100 MB" />

</Policies>

</RollingFile>

<RollingFile name="RollingFileWarn"

fileName="D:/GENDMS_FILE/logs/warn.log"

filePattern="D:/GENDMS_FILE/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">

<ThresholdFilter level="warn" onMatch="ACCEPT"

onMismatch="DENY" />

<PatternLayout

pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />

<Policies>

<TimeBasedTriggeringPolicy />

<SizeBasedTriggeringPolicy size="100 MB" />

</Policies>

<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->

<DefaultRolloverStrategy max="20" />

</RollingFile>

<RollingFile name="RollingFileError"

fileName="D:/GENDMS_FILE/logs/error.log"

filePattern="D:/GENDMS_FILE/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">

<ThresholdFilter level="error" onMatch="ACCEPT"

onMismatch="DENY" />

<PatternLayout

pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />

<Policies>

<TimeBasedTriggeringPolicy />

<SizeBasedTriggeringPolicy size="100 MB" />

</Policies>

</RollingFile>

</appenders>

<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->

<loggers>

<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->

<logger name="org.springframework" level="INFO"></logger>

<logger name="org.mybatis" level="INFO"></logger>

<root level="all">

<appender-ref ref="Console" />

<appender-ref ref="RollingFileInfo" />

<!--appender-ref ref="RollingFileWarn" /-->

<appender-ref ref="RollingFileError" />

</root>

</loggers>

</configuration>

修改struts.xml文件

头部改为:

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" ";>

增加DynamicMethodInvocation配置

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

修改后如下:

修改web.xml文件

<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter>

去掉ng,修改为:

<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class></filter>

处理启动报错

jar包冲突

删除jaxb下的 xercesImpl-2.6.2.jar 解决启动报错

再次启动依然报错,提示jar包类找不到,把原本来的class字节码复制到新版本

解决方案把原来struts2-core-2.5.30.jar下面的org/apache/struts2/dispatcher的class字节码添加到2.5版本下,字节码如下

两个字节码放到struts2-core-2.5.30.jar目录的org/apache/struts2/dispatcher下面

ServletDispatcherResult.class

StrutsResultSupport.class

启动日志报错了

原来日志如下:

日志文件修改如下:

按照上面的步骤配置完,项目就启动起来了,也就升级成功了。

标签: #apache struts版本查看