【问题标题】:Struts2 action which is called in javascript cannot get session object在 javascript 中调用的 Struts2 操作无法获取会话对象
【发布时间】:2011-11-14 02:40:09
【问题描述】:

我有一个从 javascript 调用的 struts2 动作(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()”但无法获取会话用户 ID。

我尝试通过在地址栏中绑定 url 来显式调用 Upload.action: “http://localhost:8080/observationData/Upload.action”,这次可以拿到session 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 时是否可以创建单独的会话?结果我们无法让用户进入新会话,因为我们在旧会话中设置了它?

谢谢 旭源

【问题讨论】:

  • 能否在#1 和#2 中添加sn-ps 的代码格式?
  • 您发出 Ajax 请求的站点是否与 S2 应用在同一个域中?
  • @stratwine:抱歉,这是我第一次使用 stackoverflow。我已经改进了它。谢谢!
  • @DaveNewton:请求“observationData/Upload.action”是从与 S2 应用程序相同的域发送的。
  • 您确认正在发送会话cookie吗?

标签: java javascript ajax struts2 uploadify


【解决方案1】:

试试这个,在你的脚本 url 后面加上 jsessionid 参数。

<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>

【讨论】:

  • IMO 最好弄清楚为什么正常的 cookie 机制不起作用,尽管这可能会起作用。不过,我鼓励在 scriptlet 上使用 JSP EL。
  • @machcm.sz:我试过你的建议,但还是不行。还是谢谢你。
  • @DaveNewton:我会尝试后者的萤火虫。感谢您的建议!
  • @DaveNewton:几天前我尝试了萤火虫。当uploadify 处理多个文件上传时,“Net”部分没有任何反应。所以我猜uploadify会启动一个单独的会话。
  • @Xuyuan Moi 需要猜测-没有cookie或会话ID,没有会话。 jsessionid 应该加在“;”之后,但是,不像普通的请求参数。
【解决方案2】:

Uploadify 使用 Flash。每个 Flash 应用程序都会启动一个新会话。因此,由于新会话开始,您会丢失以前的所有会话设置。 您可以通过将 id session 传递给 uploadify 来尝试解决方法。 假设您使用的是 Java,您可以这样做:

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

在您的操作或 servlet 中检索通过 uploadify 传递的 id 会话并恢复正确的会话,但没有用于此的 API,您需要通过映射 id = session 对象来实现自己的。

希望对你有所帮助。

【讨论】:

    【解决方案3】:

    由于uploadify是使用Flash上​​传文件的,我的建议是检查你的Flash插件是否有问题,或者Flash的某些配置有问题。 --在另一台电脑上是否有同样的问题?

    【讨论】:

    • 感谢您的建议。我还没有在另一台计算机上尝试过,但会尝试。 :)
    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 2012-06-01
    • 2018-02-05
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多