簡體   English   中英

在javascript中調用的Struts2動作無法獲取會話對象

[英]Struts2 action which is called in javascript cannot get session object

我有一個struts2動作,從javascript調用(javascript使用uploadify上傳多個文件):

  <script type="text/javascript"> $(document).ready(function() { $("#fileupload").uploadify({ 'uploader' : '<%=path%>/js/uploadify-v2.1.4/uploadify.swf', 'script' : 'observationData/Upload.action', ...... }); }); </script> 

Upload.action將執行一個嘗試獲取會話對象的方法:

 public class ObservationDataAction extends ActionSupport{ ...... public String uploadFile() throws Exception { System.out.println("in function uploadFile()"); ...... Map session = ActionContext.getContext().getSession(); System.out.println("Session userID is:"+((SessionUser)session.get("authority.userinfo")).getUserID()); return null; } } 

但是當javascript調用Upload.action時,它只是打印“in function uploadFile()”但無法獲取會話userID。

我嘗試通過在地址欄中綁定URL來顯式調用Upload.action:“ http://localhost:8080/observationData/Upload.action ”,這次我可以獲得會話userID。

我正在使用struts2.1.6。

這是我的struts.xml:

  <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <constant name="struts.action.extension" value="action"/> <package name="observationData" namespace="/observationData" extends="struts-default"> <action name="Upload" class="observationDataAction" method="uploadFile"> </action> </package> <struts> 

我使用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter作為過濾器類。

我也試圖實現SessionAware接口,它既不起作用。

任何人都可以幫助指出問題為什么在函數uploadFile()會話不起作用?

更多信息:這是我調用以將用戶置於會話中的函數:

public static final String SESSION_USERINFO = "authority.userinfo";
private static void saveSessionUser(SessionUser sessionUser) {
        Map session = ActionContext.getContext().getSession();
        session.put(SESSION_USERINFO, sessionUser);
    }

嗨,我正在考慮一種可能性: Ajax / JS在調用Upload.action時是否可能創建一個單獨的會話? 結果我們無法讓用戶進入新會話,因為我們在舊會話中設置了它?

謝謝徐源

Uploadify使用flash。 每個Flash應用程序都會啟動一個新會話 因此,由於新會話已啟動,您將丟失之前的每個會話設置。 您可以通過將id session傳遞給uploadify來嘗試解決方法。 假設您使用的是Java,您可以這樣做:

$("#uploadify_div).uploadify("settings", "formData", {"idSession",<%=session.getId()%>});

在您的操作或servlet中檢索通過uploadify傳遞的id會話並恢復正確的會話,但是沒有API,您需要通過映射id = session對象來實現自己的會話。

希望對你有所幫助。

試試這個,在你的腳本url之后添加jsessionid param。

<script type="text/javascript">
    $(document).ready(function() {
        $("#fileupload").uploadify({
            'uploader'       : '<%=path%>/js/uploadify-v2.1.4/uploadify.swf',
            'script'         : 'observationData/Upload.action?jsessionid=<%=session.getId()%',
            ......
        });
  }); </script>

由於uploadify使用Flash上​​傳文件,我的建議是檢查您的Flash插件或Flash的某些配置是否有問題。 - 在另一台計算機上有同樣的問題嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM