可以使用什么代替会话来存储从 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" 并且您可以在考虑该信息的情况下存储数据。
我正在使用 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" 并且您可以在考虑该信息的情况下存储数据。