現在、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");
}