9

セッションを無効にするとrequest.getSession(false)null が返されませんか? ログアウトサーブレットで呼び出します

session.invalidate();

ログインステータスフィルターで呼び出します

request.getSession(false);

getSession(false) の呼び出しで null が返されることはありませんが、返されるセッション オブジェクトに関連付けられているすべての属性は null です。現在、null 属性を検索してユーザーがログアウトしているかどうかを検出していますが、これは正しくないようです。

4

2 に答える 2

10

現在、null属性を検索して、ユーザーがログアウトしているかどうかを検出しています

これも通常のアプローチです。ユーザーがログインしているかどうかを確認するには、servletcontainerがセッションを作成したかどうかを確認しないでください。これは、ログインしているユーザーを表すものではありません。

ログイン時に、コンテナがセッションを作成したかどうかを確認せずに、ユーザーモデルオブジェクトをセッションスコープに配置するだけです。つまり、getSession()必要に応じてコンテナが自動作成されるように、ブール引数なしで使用するだけです。とにかく、この時点でセッションが必要です。

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    User user = userService.find(username, password);

    if (user != null) {
        request.getSession().setAttribute("user", user);
        response.sendRedirect(request.getContextPath() + "/home");
    } else {
        request.setAttribute("message", "Unknown login. Please retry.");
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }
}

アクセスフィルタリングでは、ログインしているユーザーを表すセッション属性が存在するかどうかを確認します。getSession(false)ここでは、不要なセッションの作成を回避するためにのみ使用します。存在しない場合、たとえば、検索ボットが完全に不要なセッションの作成をトリガーします。

@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);
    User user = (session != null) ? (User) session.getAttribute("user") : null;
    String loginURL = request.getContextPath() + "/login"; 

    if (user == null && !request.getRequestURI().equals(loginURL)) {       
        response.sendRedirect(loginURL);
    } else {
        chain.doFilter(request, response);
    }
}

ログアウト時に、無効化後にリダイレクトを送信するようにしてください。これは、現在のセッションが転送の応答で引き続き使用できるためです。

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getSession().invalidate();
    response.sendRedirect(request.getContextPath() + "/login");
}
于 2013-01-28T12:35:53.540 に答える
2

旅行するサーブレットまたはjspごとに、

request.getSession(false);

セッションバイを作成する最初のページを除いて

request.getSession(true);

電話しない場合

request.getSession(false);

その場合、セッションはそのページまで実行されないため、電話をかける前に

session.invalidate();

電話して、そのページへのセッションを継続していることを確認してください

request.getSession(false);
于 2013-01-28T07:52:21.997 に答える