9

ここに問題があります。ユーザーが私のウェブサイトからログアウトしても、戻るボタンを押してサイトを使い続けることができます。ユーザーがログインしているかどうかを追跡するために、セッション属性「isActive」を作成しました。この属性は、ユーザーのログイン時に true に設定され、ログアウト時にセッションが無効になる直前に (冗長的に) 削除されます。また、すべてのページで、属性が存在するかどうかを確認します。

また、head タグでページをキャッシュしないように指定します。

それにもかかわらず、ユーザーはブラウザーにアクセスして、ログオフしたことがないかのようにサイトを使い続けることができます。

これを修正する方法について何か考えはありますか?

コードは次のとおりです。

ログインサーブレット:

...
session.setAttribute("isActive", true);
//Redirect to home page.

ログインした JSP を確認します。

<c:if test='${empty sessionScope.isActive || sessionScope.isActive != true}'>
     <c:redirect url="/index.jsp?message=Session Timed Out."/>
</c:if>

ログアウトサーブレット:

request.getSession().removeAttribute("isActive");
request.getSession().invalidate();
response.sendRedirect("index.jsp");

ヘッドタグの内側:

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">

ありがとう

4

3 に答える 3

11

メタ タグが不十分です。完全な応答ヘッダーとしてそれらを追加する必要があります。ウェブブラウザはそれらに依存しています。AFilterはこれに役立ちます。また、Cache-Controlヘッダーが不完全です (特に Firefox では期待どおりに動作しません)。

たとえば、 of にマップされるdoFilter()a のメソッドでこれを実装します (すべての JSP ページをカバーする場合)。Filterurl-pattern*.jsp

HttpServletResponse res = (HttpServletResponse) response;
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
res.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(request, response);

このようにして、Web ブラウザーは、ブラウザーのキャッシュからページを表示するのではなく、サーバー上で実際の要求を強制的に発生させます。また、Filterログインしているユーザーの存在を確認するには、JSP/JSTL ではなく を使用する必要があります。

関連する質問:

于 2010-10-10T23:51:43.603 に答える
2

目的のページでセッションがまだアクティブかどうかを確認する必要はありませんFilter

フィルターでrequest.getSession().getAttribute("isActive")何かが返された場合、ユーザーは引き続きログに記録され、チェーンするだけです。それ以外の場合は、ログイン ページにリダイレクトします。

例えば ​​:

public class ActiveFilter implements Filter {
   public void init(FilterConfig filterConfig) 
   }
   public void destroy() {
   }
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse res = (HttpServletResponse) response;
      if (req.getSession().getAttribute("isActive") == null){
          res.sendRedirect("/index.jsp");
      }else{
          chain.doFilter(request, response);
      }
   }
}

資力 :

于 2010-10-10T23:47:51.900 に答える