ログインに使用するフィルターがあります。フィールド「ユーザー名」と「パスワード」に対してテキストチェックを実行します。テキストチェックが正しく行われた場合にのみ、リクエストはサーブレットに送信されます。この後者は、データベースと対話する必要がある制御を実行します。このチェーンは正しいですか?
質問する
67117 次
1 に答える
53
序文: コンテナー管理のログインではなく、独自のログインを使用していると思います。すべての方法については、データベース内のユーザーで認証/承認を処理する方法を参照してください。
フィルター (インターセプター) は、ユーザー名とパスワードの組み合わせの有効性をチェックすべきではありません。それはサーブレット (コントローラー) の責任です。
フィルターは、ユーザーがログインしているかどうかを確認するだけで (通常はセッション属性の存在を確認するだけで)、要求を続行するか、ログイン ページにリダイレクトしてブロックします。
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String loginURI = request.getContextPath() + "/login";
boolean loggedIn = session != null && session.getAttribute("user") != null;
boolean loginRequest = request.getRequestURI().equals(loginURI);
if (loggedIn || loginRequest) {
chain.doFilter(request, response);
} else {
response.sendRedirect(loginURI);
}
}
// ...
}
サーブレットは送信されたデータを収集し、関連User
するデータをデータベースで見つけ、見つかった場合はそれをセッション属性として保存してからホームページにリダイレクトし、そうでない場合はフォームを検証エラーとともに再表示する必要があります。
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@EJB
private UserService userService;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
Map<String, String> messages = new HashMap<String, String>();
if (username == null || username.isEmpty()) {
messages.put("username", "Please enter username");
}
if (password == null || password.isEmpty()) {
messages.put("password", "Please enter password");
}
if (messages.isEmpty()) {
User user = userService.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getContextPath() + "/home");
return;
} else {
messages.put("login", "Unknown login, please try again");
}
}
request.setAttribute("messages", messages);
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}
}
以下も参照してください。
于 2012-11-07T19:44:07.803 に答える