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

趙明威發表於2017-09-07

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專案就是這麼坑,漏洞釋出的頻率比較高

相關文章