【问题标题】:POST redirect from managed bean来自托管 bean 的 POST 重定向
【发布时间】:2014-12-23 09:48:08
【问题描述】:

我有一个简单的 JSF 和托管 bean,当页面呈现并且某些条件为真时,我需要进行 POST 重定向。 JSF:

<h:panelGroup rendered="#{myBean.error=null}">
    <p>Some data</p>
</h:panelGroup>

在托管 bean 中,init() 方法,注释为 @PostConstruct,在这个方法中我这样做

@PostConstruct
public void init() {
    if (someCondition) {
        FacesContext context = FacesContext.getCurrentInstance();
        String redirectUrl = "http://myurl.com";
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();

        try {
            ec.redirect(redirectUrl);
        } catch (IOException e) {
            e.printStackTrace();
            FacesMessage message = new FacesMessage(e.getMessage());
            context.addMessage(null, message);
        }
    }
}

但我需要使用 POST 参数将用户导航到 redirectUrl,但找不到如何操作。 使用按钮会是这样的:

<form method='post' action="myUrl">
    <input type='hidden' name='param1' value='value1'/>
    <input type='hidden' name='param2' value='value2'/>
    <input name='button'  type='submit' value="Button">
</form>

【问题讨论】:

    标签: jsf


    【解决方案1】:

    你试图达到的目标是不可能的。

    重定向将向客户端发送一个 http 302 状态代码,其中包含一个包含重定向到的 URL 的位置标头。然后客户端将向该 url 发出 get 请求,您的帖子数据将丢失。

    有其他方法可以实现这一点,这里有一些想法。

    • 您可以使用ExternalContext.html#dispatch 方法转发请求,请参阅this post 了解差异。请注意,这不会更改浏览器地址栏中的 url。
    • 您可以将帖子数据存储在用户的会话中。

    【讨论】:

    • 选项 3:使用过滤器并让 JSF 摆脱它。
    猜你喜欢
    • 2014-04-01
    • 2011-09-02
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2013-03-05
    • 2012-06-08
    • 2016-03-16
    • 2012-07-27
    相关资源
    最近更新 更多