在JSF action方法中重定向后如何避免进一步处理?

时间:2019-04-11 23:49:39

标签: session jsf redirect

具有一个简单的.xhtml,主要是一个按钮在外面:

<html 
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
>
  <f:view>
    <h:body>
      <h:form>
        <h:messages id="messages" />
        <h:outputLabel for="name-field" /><h:inputText id="name-field" value="#{mySession.name}" />
        <h:commandButton value="Submit" action="#{myService.goOutside}" />
      </h:form>
    </h:body>
  </f:view>
</html>

还有一个支持它的简单后备bean:

@Named
@SessionScoped
public class MySession implements Serializable {
  private String name = "My Name";

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  private static final Logger LOG = Logger.getLogger(MySession.class.getName());

  @PostConstruct
  public void init() {
    LOG.info("MySession initialized!");
  }
}

还有RequestScoped bean支持goOutside服务方法:

@Named
@RequestScoped
public class MyService {
  private static final Logger LOG = Logger.getLogger(MyService.class.getName());

  public String goOutside() throws IOException {
    LOG.info("Enter goOutside");
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.invalidateSession(); // To make sure that old session with old user defaults are not retained!
    ec.redirect("https://en.wikipedia.org/");
    LOG.info("Exit goOutside");
    return null;
  }
}

这按预期方式工作-在记录“退出goOutside”之后,我看不到“ MySession已初始化!”直到并且除非我重新访问原始的xhtml。

在我的完整代码的上下文中-直到这些部分看起来基本上相同,我没有得到这样的行为:MySession bean在重定向之后和重新访问原始URL之前立即被重新初始化。

我仍在尝试剥离原始代码,直到它能以最小的代码量找出应该中断的地方-但由于将其编织到其余部分中,我觉得可能要花点时间

如果将引入关于此问题的任何想法-这将缩短我的研究。或者,我可以将问题改写为:“我应该在上面的代码中添加些什么,以便立即看到MySession初始化?”。

0 个答案:

没有答案