可以使用什么代替会话来存储从 liferay 中的多个请求获得的变量

what can be used instead of session for storing variables obtained from multiple requests in liferay

我正在使用 liferay MVC。在该项目中,我有一个 portlet,它会处理许多不同的请求,比如渲染和请求,并从每个请求中获取一些数据。我在整个周期的会话中存储相同的数据,但如果我在浏览器中打开一个新选项卡,数据就会变得混乱,最近请求的数据与以前的数据重叠。

我尝试使用模型来存储数据,即使将 new 关键字与对象一起使用,引用始终指向所有其他请求的新请求。

那么在这些事情上可以用什么来代替会话。

这是我的示例代码:

        public void init() throws PortletException {

                viewJSP = getInitParameter("view-template");
                System.out.println("View Jsp is " + viewJSP);
            }
                Modelxyz xyz;
        public void doView(RenderRequest renderRequest,
                    RenderResponse renderResponse) throws IOException, PortletException {
                xyz = new Modelxyz();
                HttpSession session = PortalUtil.getHttpServletRequest(renderRequest)
                        .getSession(false);

                try {
                    themeDisplay = (ThemeDisplay) renderRequest
                            .getAttribute(WebKeys.THEME_DISPLAY);

                    List<x> x = xLocalServiceUtil.findByx(true);

                    renderRequest.setAttribute("x", x);
                    session.setAttribute("x,);

                    include(viewJSP, renderRequest, renderResponse);

            }

        public void serveResource(ResourceRequest rrq, ResourceResponse rrr)
                throws PortletException, IOException {
               if (resourceID.equals("gety")) {

      HttpSession session = PortalUtil.getHttpServletRequest(renderRequest)
                        .getSession(false);
      session.getAttribute("x",x);
             y=getY(x);
      session.setAttribute("y",y);
    }else if(resourceID.equals("getz")) {

    //use y to get z

     HttpSession session = PortalUtil.getHttpServletRequest(renderRequest)
                        .getSession(false);
     session.getAttribute("y");

     z=getz(y);

     session.setAttribute("z",z);
    }

即使我尝试使用

模型 class 来存储 x 和 y

模型xyz xyz=新模型xyz(); //假设它有 getters 和 setters

public void serveResource(ResourceRequest rrq, ResourceResponse rrr)
                    throws PortletException, IOException {
                   if (resourceID.equals("gety")) {

        x=xyz.getX();
        y=getY(x);
         xyz.setX(y);

        }else if(resourceID.equals("getz")) {

        //use y to get z


         y=xyz.getY();
         z=getz(y);

         xyz.setZ(z)
        }

当从不同的 tabs.What 使用时,这也弄乱了数据可以替代吗???

如果我没有理解错你的"issue",它与Liferay无关。您正在连接到一个 Web 应用程序(在您的情况下恰好是 Liferay)。应用程序服务器为您创建一个会话并将会话 ID(很可能通过 cookie)传回您的浏览器。下次您的浏览器发送请求时,它还会提供一个会话 ID,以便服务器可以将请求与活动会话相关联。对于来自浏览器中每个选项卡的每个请求(直到会话无效),该会话 ID 都是相同的!因此,从服务器的角度来看,如果您从同一选项卡重新发送同一请求或者您有不同的选项卡,都没有区别。从服务器的角度来看,它只是其中包含会话信息的下一个请求。

据我所知,您只是在每次 render 请求时在会话中设置值并在 serveResource 请求时读取它。这意味着如果您从同一个浏览器发送多个 render 请求(无论是否是不同的选项卡,它们都将具有相同的会话 ID),每个后续请求都将覆盖前一个请求的值。我猜这就是你所说的"messes up the data"!如果是这样,那么您存储该数据的位置就无关紧要了。

因此

的答案

what can be used instead of session for storing variables obtained from multiple requests in liferay

是:你实现它的方式,它总是"mess up the data"不管 它存储在哪里!

也就是说,我可以立即想到两种方法来解决 "solve" 这个问题:

  • 您可以检查给定值是否已保存,并在任何后续尝试重置它的请求时报告错误。

  • 你可以引入一些代币(或者一般来说任何能让你拥有 "conversation scope" 的东西)。这样每个请求都需要指明它属于哪个 "conversation" 并且您可以在考虑该信息的情况下存储数据。