JSF 2: переход к внешнему URL-адресу из компонента поддержки - PullRequest
0 голосов
/ 23 декабря 2011

Это своего рода расширение вопроса Перейдите на внешний 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();
    }
}

1 Ответ

0 голосов
/ 23 декабря 2011

Это вызвано <f:event type="preRenderView"> и поведение полностью указано.

По сути, вы хотите убить это событие. Я никогда не пробовал его в этой конструкции, поэтому по опыту не могу понять, работает ли он, но вы можете попытаться получить события по UIViewRoot#getViewListenersForEventClass(), а затем очистить их перед перенаправлением.

UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
viewRoot.getViewListenersForEventClass(PreRenderViewEvent.class).clear();
// ...

Теоретически это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...