gpt4 book ai didi

liferay - 为什么 Liferay 6.0.6 在 post-render URL 中包含 portlet action 参数?

转载 作者:行者123 更新时间:2023-12-01 12:58:13 25 4
gpt4 key购买 nike

如果我提交到以下生成的 URL:

<portlet:actionURL name="myAction" />

我最终得到了类似 ff 的东西。呈现阶段后浏览器中的 URL:

http://localhost:8080/...&_myportlet_WAR_myportlet_javax.portlet.action=myAction&...

问题在于,如果我单击浏览器的刷新按钮,该操作将再次执行。据推测,这是由于 URL 中存在该参数所致。

有谁知道为什么 Liferay 在 URL 后渲染中包含该参数,是否有修复或解决方法?

编辑:我的 portlet 类扩展自 com.liferay.util.bridges.mvc.MVCPortlet

最佳答案

The problem with this is that, if I click on the browser's refresh button, the action gets executed again. Presumably, this is due to the presence of that parameter in the URL.

我怀疑。可能是因为你通过 HTTP POST 方式提交了数据。还是通过 GET 提交数据?如果是这样,那将是一种奇怪的行为。

关于 URL 中的参数:我没有答案,但这种行为对我来说并不奇怪。例如,假设我们使用 doGet()doPost() 方法创建一个 servlet。如果我通过 post 向 URL 提交一些数据(可能是为了执行某些操作),doPost() 方法的响应将与提交的 URL 相关,因此结果页面的 URL 将是相同的。我们可以在这里遵循相同的逻辑:如果您提交到操作阶段,则提交的 URL 将成为结果。

如何处理? 答案是POST-REDIRECT-GET图案。您应该发送 HTTP 302从您的 processAction() 方法响应浏览器,通常将浏览器重定向到原始页面。

要做到这一点很简单。表单页面的 JSP 应将当前 URL 存储在表单的输入中:

<%
String redirect = PortalUtil.getCurrentURL(renderRequest);
%>
<input type="hidden" name="<portlet:namespace />redirect" value="<%= redirect %>">

然后您在 processAction() 中重定向到此 URL。 如果你使用的是Liferay MVCPortlet,你只需要在所有操作之后调用sendRedirect()方法:

public void processAction(ActionRequest req, ActionResponse resp) {
// Doing stuff
sendRedirect(req, resp);
}

如果原始 URL 的值在名为 “redirect” 的请求参数中,那么此方法将神奇地将您重定向回原始页面。

如果您使用 Liferay MVC 而只是 GenericPortlet 的子类,只需从请求中检索 URL 并使用方法ActionResponse.sendRedirect():

public void processAction(ActionRequest req, ActionResponse resp) {
// Doing stuff
String redirect = (String)actionRequest.getAttribute("redirect");
resp.sendRedirect(redirect);
}

关于liferay - 为什么 Liferay 6.0.6 在 post-render URL 中包含 portlet action 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com