struts2.3.15升级到2.5.13需要做的工作

1.首先jdk1.6要升级到jdk1.7以上

由于jdk1.6和1.7的一些方法不同,一些类中方法需要修改

  • MonitorService.java
  • FileUpftp.java jdk1.6 jdk1.7 FTPClient 的不同 主要是FTPClient和线程方面的一些方法修改(以后加上)
    FTPClient 1.实例化的变化: 只列举主要变化其他内容不列举
jdk1.6版本jdk1.7
   //登录服务器
    ftpClient = new FtpClient(ipAddress, ipPort);
    ftpClient.login(userName, PassWord);
   //登出
   ftpClient.sendServer("QUIT\r\n");
   //建目录
   ftpClient.ascii();
   ftpClient.sendServer("XMKD " + pathName + "\r\n");
   ftpClient.binary();
   //上传文件到FTP服务器
   TelnetOutputStream ftpOut = ftpClient.put(destination);
   //从FTP文件服务器上下载文件
  TelnetInputStream ftpIn = ftpClient.get(SourceFileName);
   //从FTP文件服务器上删除文件
    String str = "DELE "+path+"/" + FileName + "\r\n";
    ftpClient.sendServer(str);
  
   //登录服务器
   ftpClient = FtpClient.create(ipAddress);
   ftpClient.login(userName,null, PassWord);
   //登出
  ftpClient.close();
  //建立目录
  ftpClient.setAsciiType();
  ftpClient.makeDirectory("XMKD " + pathName + "\r\n");
  ftpClient.setBinaryType();
  //上传文件到FTP服务器
  TelnetOutputStream ftpOut = 
            (TelnetOutputStream) ftpClient.putFileStream(destination);
  //从FTP文件服务器上下载文件
  TelnetInputStream ftpIn = 
            (TelnetInputStream) ftpClient.getFileStream(SourceFileName);
  //从FTP文件服务器上删除文件
   String str = path+"/" + FileName;
   ftpClient.deleteFile(str);

2.struts2包替换(建议maven管理jar包,替换简单)

下载jar包
struts2.5.13所有的jar包从官网下载的
https://struts.apache.org/index.html 最新的jar包https://struts.apache.org/download.cgi#struts2513

Version Notes
Full Distribution:
struts-2.5.13-all.zip (65MB) [PGP] [MD5]

然后替换所有struts开头的jar包,具体细节不说了就是烦,删除了下面这个jar包 xwork

3.修改web.xml:

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
修改成
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>

4.struts2配置修改

struts.xml部分的头部修改

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

问题报错:

org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException:  
org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException:    
.apache.struts2.json.JSONException: java.lang.reflect.InvocationTargetException  

网上解决办法:http://ask.csdn.net/questions/260958

安全

这是因为 struts2.5 为了提升安全性,添加了 allomethod 这么个玩意。
解决方法是在配置文件中添加:

<package name="exam" extends="json-default">
    <global-allowed-methods>regex:.*</global-allowed-methods>
<action name="user" class="userAction">
        ...
</action>
</package>

或者,针对action,在 action 块中添加

<allowed-methods>regex:.*</allowed-methods>

同样也支持在你的 action 上使用 @AllowedMethods 注解
默认的设置为

<global-allowed-methods>execute,input,back,cancel,browse,save,delete,list,index</global-allowed-methods>

全局设置是增量而不是覆盖的,支持正则和直接匹配方法,源码在这两段

// com.opensymphony.xwork2.DefaultActionProxy#prepare  
// com.opensymphony.xwork2.config.entities.ActionConfig#isAllowedMethod  

老项目因为爆出漏洞然后我找了一下午这个问题,最终打开研发模式,并搜索官网文档解决。 struts 真是个坑啊。


5.struts2页面修改

页面报错,否则报错如下:

Struts has detected an unhandled exception:
Messages:    
/tagDef/export_record_now.jsp (line: 41, column: 4) Attribute id invalid for tag iterator according to 
TLD
File:    org/apache/jasper/compiler/DefaultErrorHandler.java

页面中一些标签需要修改: jstl标签中的变量id要变为var如图:

页面修改

struts项目就是这么坑,漏洞发布的频率比较高