2

PHPでは、メンバーIDのセッションをチェックすることで、ユーザーがログインしているかどうかを認証していました。OKに設定されている場合、ページはヘッダーを介してログインページにリダイレクトされます。この認証スクリプトは auth.php にあり、ログインが必要なページに含めていました。単純。しかし、私はjspで同じことをすることはできません. auth.jsp が何を行っても、auth.jsp を含むページの残りの部分が読み込まれるためです。auth.jsp は

<%
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user == null) {
%>
<jsp:forward page="/index"/>
<%
return; 
}
%>

ユーザーがログインしていない場合でも、ログイン ページの下に元のページが表示されます。このため、すべてのページで if else を使用してチェックするユーザーを手動で含める必要があり、非常に不便です。解決策はありますか?? 含むページは

<jsp:include page="auth.jsp" />
<p>Welcome</p>
4

2 に答える 2

1

サーブレット フィルターは間違いなくあなたが探しているものです。コンテナー管理またはスプリング セキュリティを取得することもできますが、知識があると、適切な把握を行うには距離が遠すぎる可能性があります。

doFilter()フィルターのメソッドがどのように見えるかの基本的な例を次に示します。

if (UserServiceFactory.getUserService().getCurrentUser() != null) {
    chain.doFilter(request, response); // User is logged in, just continue request.
} else {
    ((HttpServletResponse) response).sendRedirect("/login.jsp"); // Not logged in, show login page. You can eventually show the error page instead.
}

認証したいページをカバーするweb.xml上でこのフィルターをマップします。url-patternたとえば、、/secured/*などで/private/*/authenticated/*すべての JSP (ログイン ページを除く) を同じフォルダに配置します。


JSP で失敗する理由については、応答が既にコミットされている場合に発生する可能性があります。サーバー ログを読んだことがある場合は、呼び出さIllegalStateException: Response already committedれた時点で確認できるはずです。<jsp:forward>これが PHP で機能するのは、おそらく、より大きな応答バッファーがあるためか、そのロジックが偶然に応答本文の任意の部分の前に正しく呼び出された<!DOCTYPE>ためです。応答がコミットされていない限り、転送またはリダイレクトを使用して宛先を変更できます。

于 2010-07-29T16:45:57.860 に答える
1

少なくとも、独自のカスタム サーブレット フィルターを作成できます。何もしなくても、リクエストが行われるたびに呼び出されます。

また、コンテナ レベルのセキュリティや、Spring セキュリティなども検討する必要があります。どちらもこれを処理します。

編集:

問題ない。

それまでの間、おそらく auth.jsp で次のようなことをしたいと思うでしょう。

<%
  if (user == null){
    response.sendRedirect(redirectURL);
  }
%>

これは一種のようなものです

response.addHeader("location", "/login.jsp");

これは、PHP で慣れ親しんだものと似ています。

于 2010-07-29T15:33:39.030 に答える