0

DB からのデータを格納する @ApplicationScoped Bean があります。すべてのユーザーにとって同じデータであるため、@ApplicationScope Bean に配置することにしました。

ただし、次の側面:

  1. ユーザーがアプリケーションを開く (保存されたデータが表示されるログイン ページ)
  2. データが表示されます
  3. ユーザーのログイン
  4. ユーザーがログアウトする
  5. ログインページに移動します(保存されたデータが表示されます)

ログアウト後、次のエラーが表示されます (応答がコミットされた後にセッションを作成できません):

10:02:37,284 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/kundenportal].[Faces Servlet]] (http-localhost-127.0.0.1-8080-5) Servlet.service() for servlet Faces Servlet threw exception: java.lang.IllegalStateException: Cannot create a session after the response has been committed
at org.apache.catalina.connector.Request.doGetSession(Request.java:2636) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.Request.getSession(Request.java:2375) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:841) [jbossweb-7.0.13.Final.jar:]
at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:155) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.renderkit.ServerSideStateHelper.writeState(ServerSideStateHelper.java:175) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122) [jsf-impl-2.1.7-jbossorg-2.jar:]

これはログアウト方法です:

public String logout() {
    ((HttpServletRequest) FacesContext.getCurrentInstance()
            .getExternalContext().getRequest()).getSession(false)
            .invalidate();
    return "loginFAILED"; // navigate to login-page
}

間違った資格情報でログインしようとすると、同じエラーが発生します。実際、資格情報が間違っている場合は、ログアウト メソッドを呼び出します (無効にし、再度ログイン ページに移動します)。さらに、うなるメッセージが表示されるはずです。ログイン ボタンをクリックしても何も起こらないため、別のログインを試みたい場合は、ページを更新する必要があります。

これは私の@ApplicationScoped Beanです:

@Named
@ApplicationScoped
public class NewsController extends BaseController implements Serializable {
private static final long serialVersionUID = 1L;

@PersistenceContext
protected EntityManager em;

private List<News> newsList;

@PostConstruct
public void init() {
    getAvailableNews();
}

public void getAvailableNews() {
    if (newsList == null) {
        newsList = new LinkedList<News>();
        Query q = em.createNativeQuery(
                "SELECT * FROM news WHERE sysdate BETWEEN ab AND bis+1",
                News.class);
        @SuppressWarnings("unchecked")
        List<News> result = q.getResultList();
        for (News n : result)
            newsList.add(n);
    }
}

public List<News> getNewsList() {
    return newsList;
}

public void setNewsList(List<News> newsList) {
    this.newsList = newsList;
}

}
4

0 に答える 0