1

こんにちは、私はjsf2.0、prettyfaces、primesfacesを使用しています

ユーザーセッションを監視するフィルターを作成しました

@WebFilter(urlPatterns= {"*.xhtml"} , dispatcherTypes = {DispatcherType.REQUEST})
public class Authentication implements Filter {

@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("[Authentication Filter] : init Method");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
PrettyContext context = PrettyContext.getCurrentInstance(request);      
if (!(context.getCurrentMapping().getId().equals("login")) && (session == null || session.getAttribute("username") == null)) {
{
response.sendRedirect(request.getContextPath()+"/login");
}
else {
chain.doFilter(req, res); // Logged-in user found, so just continue request.
}
@Override
public void destroy() {}
}

web.xml

<welcome-file-list>
<welcome-file>/</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

pretty-config.xml

<url-mapping id="home"> 
<pattern value="/" /> 
<view-id value="index.xhtml" />
</url-mapping> 

dispatcherTypes = {DispatcherType.REQUEST} を使用すると、context.getCurrentMapping().getId() で null ポインター例外が発生します。このステートメントは、上記の if ステートメントで使用していますが、dispatcherTypes = {DispatcherType.FORWARD} の場合、私にとっては正常に機能します何が起こっているの?DispatcherType.REQUEST と DispatcherType.FORWARD の違いを知りたいのですが、別の質問は FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); を使用する場合です。セッションを復元するために、ブラウザから [戻る] ボタンを押すと、ブラウザが前のページを表示するのはなぜですか? ありがとう、[戻る] ボタンにログインページが必要です。

4

1 に答える 1

3

PrettyFaces は、着信要求をサーブレット フィルターでインターセプトし、それを実際の URL に転送することで、URL 書き換えを実装します。

フィルタのDispatchTypeは、フィルタを適用する要求の種類を構成します。デフォルトはREQUEST、通常のケースです。に設定するとFORWARD、内部で転送されるリクエストにのみ適用されます (これが PrettyFaces の機能です)。

REQUESTフィルターが PrettyFaces フィルターの前に実行されるため、NPE を取得している場合は、 PrettyContext.

あなたのケースで使用することは絶対に問題ありませんFORWARD。覚えておかなければならない唯一のことは、転送されたリクエストのきれいな URL ではなく、実際のHttpServletRequest.getRequestURI()URLを返すことです。

戻るボタンの問題は、おそらくキャッシュに関連しています。正しいキャッシュ ヘッドを設定しないと、ブラウザーは最後のページをキャッシュするため、[戻る] を押すと、サーバーに要求を送信せずに最後のページが再表示されます。

于 2013-04-15T05:45:35.000 に答える