2017-02-15 21 views
-1

Я использую liferay MVC. В проекте у меня есть портлет, который обращается к множеству разных запросов: сканирование и запрос и получение некоторых данных из каждого запроса. Я сохраняю те же данные в сеансе для полного цикла, но если я открою новую вкладку в браузере, данные перепутаются. Данные из последнего запроса перекрывают предыдущие данные.что можно использовать вместо сеанса для хранения переменных, полученных из нескольких запросов в liferay

Я попытался использовать модель для хранения данных, даже используя новое ключевое слово с объектом, ссылка всегда указывает на новый запрос для всех других запросов.

Итак, что можно использовать вместо сеансов для таких вопросов.

вот мой пример кода:

 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); 
    } 

Даже когда я попробовал класс модели для хранения х и у, используя

Modelxyz хуг = новый Modelxyz(); // предполагает, что это имеет методы получения и установки

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 может быть альтернативой для этого ???

+1

Что вы подразумеваете под «но если я открою новую вкладку в браузере, данные будут испорчены»? Из того, что я знаю, если вы посещаете один и тот же вид на двух вкладках A и B в том же браузере, поскольку он использует один и тот же сеанс пользователя, тогда данные, которые будут сохранены, будут иметь последнюю вкладку, которая отправляет запрос на сервер (либо A, либо B). Это ожидаемое поведение. Что вам нужно? Кроме того, если вы используете модель для хранения этих данных, модель должна храниться где-то в другом месте, например сеанс или база данных, но опять же сценарий, изображенный выше, снова будет расти. –

+0

С помощью модели снова данные перепутались, с использованием сеанса ожидалось ........ но я думаю, проблема связана с общим объектом, так как ссылка xyz всегда указывает на самый последний объект. Теперь я ищу решение, в котором я мог бы хранить данные с разных вкладок в отдельном объекте модели отдельно, но я не могу продолжить. –

+0

Вы ищете уникальные сеансы для разных вкладок в одном браузере? Потому что это то, что не поддерживается браузером. Попробуйте моделировать свой сценарий с помощью какого-то стандартного веб-приложения, такого как Gmail или что-то в этом роде. Также, пожалуйста, проясните бизнес-сценарий который требует этой логики. –

ответ

1

Если я правильно понимаю вашу «проблему», это не имеет никакого отношения к Liferay. Вы подключаетесь к веб-приложению (в вашем случае это Liferay). Сервер приложений создает для вас сеанс и передает идентификатор сессии (скорее всего через cookie) обратно в ваш браузер. В следующий раз, когда ваш браузер отправит запрос, он также предоставит идентификатор сеанса, чтобы сервер мог связать запрос с активным сеансом. Этот идентификатор сеанса будет одинаковым для каждого запроса (до тех пор, пока сеанс не будет признан недействительным), придя к каждой вкладке в вашем браузере! Поэтому с точки зрения сервера не имеет значения, если вы повторно отправите тот же запрос с той же вкладки или у вас есть другая вкладка. С точки зрения сервера это просто следующий запрос, в котором есть информация о сеансе.

Из того, что я вижу, вы просто устанавливаете значение в сессии на каждый запрос render и читаете его по запросу serveResource. Это означает, что если вы отправляете более одного запроса render из того же браузера (который будет иметь тот же идентификатор сеанса, независимо от того, будет ли он другой вкладкой или нет), каждый последующий запрос перезапишет значение предыдущего. Наверное, это то, что вы называете «испортить данные»! Если это так, то место хранения этих данных не имеет значения.

Поэтому ответ на

, что может быть использован вместо сессии для хранения переменных, полученных из нескольких запросов в Liferay

является: , как вы реализовали его, он будет всегда «беспорядок up data "неважно где он хранится!

Тем не менее, есть два способа, я могу думать сразу же, чтобы «решить» вопрос:

  • вы можете проверить, если данное значение уже сохранен и сообщить об ошибках на любой последующий запрос пытаясь сбросить его.

  • вы можете ввести некоторые токены (или вообще что угодно, что позволит вам иметь «область разговора»). Таким образом, каждый запрос должен указывать, к какому «разговору» он принадлежит, и вы можете хранить данные, принимающие эту информацию.

+0

Привет, я хотел бы узнать больше о втором подходе, т. Е. Использовать «область разговора», не могли бы вы предоставить немного больше информации о том, как это можно добиться, глядя в код, который я поделил. Спасибо :) –

+0

В общем, вам нужно определить начальную точку беседы. Это может быть пользователь, загружающий вашу страницу (например, запрос «render»). Вы должны проверить, имеет ли запрос параметр идентификатора беседы. Если это не так, вы создадите новый. Затем при рендеринге страницы вы создаете каждую ссылку на ней таким образом, чтобы этот идентификатор беседы был параметром. Вы также можете перевернуть логику. Используйте некоторый javascript, чтобы идентифицировать вкладку браузера и генерировать идентификатор разговора (или идентификатор табуляции, если хотите), который вы отправляете с запросом. Затем серверная сторона использует это для хранения информации отдельно. –

+0

Что я сделал, я использовал jquery, чтобы сохранить значения и получить их на другом шаге от jquery, спасибо за идею. Это сработало для меня:) –