Действие Struts2, которое вызывается в javascript, не может получить объект сеанса - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть действие 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, он просто печатает «в функции uploadFile ()», но не может получить идентификатор пользователя сеанса.

Я попытался вызвать Upload.action явно, привязав URL-адрес в адресной строке: «http://localhost:8080/observationData/Upload.action», на этот раз я могу получить идентификатор пользователя сеанса.

Я использую стойки2.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? В результате мы не можем получить пользователя в новом сеансе, потому что мы установили его в старом сеансе?

Спасибо Xuyuan

Ответы [ 3 ]

1 голос
/ 04 ноября 2013

Uploadify использует вспышку. Каждое flash-приложение начинает новый сеанс. Таким образом, вы теряете настройки каждого предыдущего сеанса из-за нового сеанса. Вы можете попробовать обходной путь, передав идентификатор сессии для загрузки. Предполагая, что вы используете Java, вы можете сделать так:

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

В вашем действии или сервлете получите сеанс id, прошедший через uploadify, и возобновите нужный сеанс, но для этого нет API, вам нужно реализовать свой собственный, сопоставив id = session object.

Надежда тебе помогает.

1 голос
/ 14 ноября 2011

Попробуйте это, добавьте параметр jsessionid после URL вашего скрипта.

<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>
0 голосов
/ 14 ноября 2011

Поскольку uploadify использует Flash для загрузки файлов, я предлагаю проверить, есть ли что-то не так с вашим плагином Flash, или с некоторыми конфигурациями Flash.- Есть ли такая же проблема на другом компьютере?

...