2009-07-22 9 views
5

ユーザーがシステムに正常にログインすると、システムはユーザーをホームページにリダイレクトします。今私の問題は、ユーザーがシステムにログインせずにビューアカウントページをクリックすると、システムはユーザーをログインページにリダイレクトします。ユーザがシステムにログインすると、システムはユーザをホームページにリダイレクトします。この場合、どの方法でもホームページの代わりにビューアカウントページである前のページにリダイレクトできますか?JSFナビゲーションは前のページにリダイレクト

私はセッション

String url = (String)session.getAttribute("url"); 
if(url != null) 
    response.sendRedirect(url); 
else 
    response.sendRedirect("homepage.faces"); 

を使用してみましたユーザのログインに成功した場合、私は、URLにリダイレクトその後、(){}公共ボイドdoBtnActionの下にこのコードを置きます。私はあなたが自分のコードで認証を行うことを前提としてしかし、私はあなたが認証に使用するすべてのフレームワークの機能を説明していないこのエラー

java.lang.IllegalStateException: Cannot forward after response has been committed 
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322) 
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87) 
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198) 

答えて

0

を得ました。おそらく、ログインページにリダイレクトする前に最初の宛先をセッションに保存し、ログインに成功した後、この属性をチェックして適切な場所にリダイレクトするのが最も簡単な方法です。 特にJSFの場合、ログインを処理するアクションメソッドでこれを行うことができます。 実際には、春のセキュリティなどの認証用のフレームワークを使用することをお勧めします。そのようなことは覚えていますし、いくつかの追加機能が必要な場合にセキュリティシステムを拡張する方がはるかに簡単ですいくつかの追加設定

+0

Seamはまた、あなたがnullの場合、私はセッションがnullであるかどうかを確認するためにJSFおよびフィルタを使用しています箱 – mtpettyp

+0

の外にこれを行うことができますユーザーをログインページにリダイレクトします。 –

2

わからないが、ExternalContext施設を通じてこれをやってみてください。このような

何か:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
externalContext.redirect(externalContext.encodeResourceURL(externalContext.getRequestContextPath()+getUrl())); 
-2

あなたは手遅れだとそれはあなたの例外を与えています。 phaselistener の前にのレンダレスポンスフェーズを実行します。

+3

これは意味をなさない。 – BalusC

15

この例外は、response.sendRedirect()を呼び出し、JSFが通常の応答を表示するのをブロックしなかったために発生します。アクションメソッドに

FacesContext.getCurrentInstance().responseComplete(); 

を追加して、通常の応答を処理する必要がないことをJSFに通知する必要があります。

さらに良い

または、ちょうどJSFのフードの下からHttpServletResponseを得ることはありませんが、代わりに実行します。

FacesContext.getCurrentInstance().getExternalContext().redirect(url); 

この自動的responseComplete()を起動すると、それはまた、不必要なサーブレットAPIのものからあなたのコードをきれいに保ちます。 ExternalContext APIも参照してください。

+0

私はstackoverflowが大好き!私はまだ質問をする必要があります。なぜなら私はいつもここですでに答えているからです。ありがとうBalusC。 – Naganalf

+0

私の場合、これは動作しません.HttpSessionでgetAttribute( "url")を呼び出すと、nullが返されます。私はHttpServletRequestでgetRequestURI()を呼び出そうとしましたが、ログインしていなければユーザーがリダイレクトされるログインページのURIを返します。 – Theo

+0

@Theo:それはまったく別の問題です。あなたはまずそれを自分で設定しなければなりません:) – BalusC

0

java.lang.IllegalStateException:前方応答が

をコミットされていることはできません後に例外はかなり明確である:

  • レスポンスがコミットされました。
  • 応答がコミットされた後に転送することはできません。

意味がありません。

0

記述されているロジック(login-redirect)は、フィルタの仕組みを通して実装する必要があります。また、標準のjsfナビゲーションルールを試すこともできます(ケースに合う場合)。また、依然としてカスタムURLにリダイレクトを送信し、フィルタを使用したくない場合は、jsf beanではなく、レンダリングフェーズでサーブレットで行います。

-2

web.xmlので以下の構文は動作するはず配置:

<context-param> 
<param-name>com.sun.faces.writeStateAtFormEnd</param-name> 
<param-value>false</param-value> 
</context-param> 
+0

これは**異なる**原因の解決策であり、これはまったく同じ例外ではありません。 http://stackoverflow.com/questions/8072311/illegalstateexception-cannot-create-a-session-after-the-response-has-been-commi/8072445#8072445も参照してください。 – BalusC

関連する問題