Это своего рода расширение вопроса
Перейдите на внешний URL-адрес из базового компонента?
Мне нужно аннулировать сеанс в методе bean-компонента и затем перенаправить его на внешний URL-адрес. Компонент outputLink не имеет возможности вызывать метод действия (в этом случае метод выхода из компонента).
Если я использую commandLink, метод действия вызывается, но после того, как сеанс признан недействительным, перед пересылкой на внешний URL-адрес создается другой сеанс.
Чтобы быть более конкретным: у меня есть представление, которое загружает список элементов на главной странице. На главной странице есть куча ссылок (одна из них - изображение / кнопка выхода из системы) вверху, которые приходят из шаблона xhtml. В файле шаблона xhtml у меня есть код commandLink, который вызывает метод выхода из системы LogoutBean.java. Метод вызывается нормально, как и ожидалось, НО, когда я ставлю точку останова в методе PostConstruct HomeBean, я вижу, что этот метод вызывается после аннулирования сеанса, а затем перенаправляется на внешний URL-адрес. Как это предотвратить?
Код:
template.xhtml:
<h:form>
<p:panel id="HomeHeaderPanel" styleClass="tableheaderfont" style="width:98%">
<h:panelGrid id="filterGrid" columns="2" cellpadding="0" styleClass="normalfont" style="width: 98%" columnClasses="leftalign,rightalign">
<h:panelGroup>
<h:link outcome="reviewHome.xhtml?faces-redirect=true" id="homeLink"
title="Review Home">
<h:graphicImage value="images/home_small.png" id="homeIcon" alt="Review Home"/>
</h:link>
<p:spacer width="5"/>
<h:commandLink action="#{logoutBean.logout}" >
<h:graphicImage value="images/logout_small.png" id="logoutIcon" alt="Logout" title="Logout"/>
</h:commandLink>
</h:panelGroup>
</h:panelGrid>
</p:panel>
</h:form>
reviewHome.xhtml:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui">
<f:view contentType="text/html">
<ui:composition template="template.xhtml">
<ui:define name="content">
<h:form styleClass="form" id="ptpReviewForm">
<f:event listener="#{homeBean.refresh}" type="preRenderView" />...content here...
</h:form>
</ui:define>
</ui:composition>
</f:view>
</html>
HomeBean.java:
@ManagedBean
@SessionScoped
public class HomeBean implements Serializable{
/**
*
*/
private static final long serialVersionUID = 3303546811067129792L;
public HomeBean(){}
@EJB
private ReviewEJB reviewEJB;
private List<HomeObject> homeList;
@SuppressWarnings("unused")
@PostConstruct
private void populateItpList()
{
logger.debug("In the PostConstruct method");
homeList = reviewEJB.getList();
}
//This method is loaded every time the Review Home view loads (prerenderView event)
public void refresh()
{
String refresh = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("refresh");
if(null != refresh && refresh.equalsIgnoreCase("true"))
{
homeList = reviewEJB.getList("another");
}
}
LogoutBean.java:
@ManagedBean
@SessionScoped
public class LogoutBean {
public void logout() throws ServletException
{
try {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
((HttpServletRequest) ec.getRequest()).logout();
HttpSession session = (HttpSession) ec.getSession(false);
// invalidate session
if (session != null) {
session.invalidate();
}
ec.redirect("/anotherWebAppContext/forward.jsp?link=review");
} catch (IOException e) {
e.printStackTrace();
}
}