編集:
オンラインでリソースを見つけることができないようで、初めて説明するのにひどい仕事をしたので、この説明を馬鹿にしようとします. 私の目標は何ですか:
任意の JSP から開始します (ユーザーがサイト内でアクセスできる場所ならどこでもかまいません) が、議論のためにindex.jsp
. ユーザーがログインが必要な操作を行おうとすると、 という別のページでその操作を行うように求められますlogin.jsp
。ここで、ユーザーは認証サーブレットに送信されるフォームを送信してログオンし、元の場所にリダイレクトされますが、この例ではindex.jsp
. 以下に、これまでに行ったことを説明します。私はセッションを試しましたが、それを介してURLを送信しない原因となったこの奇妙な風変わりな動作があります。また、GET を介して URL を追加したくありません。追加すると表示され、見苦しくなるからです。そのロジックをユーザーから隠しながらこれを行うことは可能ですか?
これまでに試したことは、ページがユーザーにログインを指示するときはいつでも、URL を追加してAuthenticate.java
サーブレットに送信することです。doGet()
そこで、ログインにリダイレクトする を呼び出すためlogin.jsp
、request
変数から my にアクセスできます。問題は、URL が指しているのではなくlogin.jsp
、私の認証サーブレットと追加された URL を指していることです。したがって、次のようになります。
http://localhost:8080/app/login
しかし、それは言います
http://localhost:8080/app/authenticate?url=/index.jsp
もう少し理にかなっているように、コードを提供します。説明が必要な場合は、お気軽にお尋ねください。ありがとう。
アップデート:
わかりました、更新する必要があるようです/ Hardik Mishra の懸念に対処するために、リダイレクトを行ったことをお詫びします。私へのリダイレクトは、コントローラーであるため、別のページに指示することで情報を渡すことを意味する可能性があるため、一般的/大まかにこの用語を使用しました。ご覧のとおり、私は明らかにを使用していRequestDispatcher
ます。私はドキュメントを読むのに十分な能力があるので、応答にはsendRedirect()
使用できる方法があることがわかります。しかし、上で述べたように、上記の理由からセッションを使用したくありません。sendRedirect()
同じに保たないrequest
私は情報を失う。しかし、私がそれらの URL を取得した場所についても混乱していたので、JSP を呼び出すサンプルを提供します。これを含めなかった理由は、ユーザーがログインを求められる前に対話していた JSP に関係なく、ユーザーを常に元の場所に戻すことが重要だからです。私の場合に使用していたJSPの例はAuth.java
、わかりやすくするために上に追加されています。また、私が時期尚早に追加したようで、それが混乱を助長した可能性があるため、再度お詫び申し上げますisLoggedIn()
。AuthUtilities
index.jsp
<%@ page import="com.myapp.app.AuthUtilities, com.myapp.app.Dbase" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<h3><%= AuthUtilities.isLoggedIn(session, request) %></h3>
<CENTER>
<h2>Welcome to UniHub! <%= request.getServletPath() %></h2>
<form ACTION="le_test" METHOD="POST">
<input TYPE="text" name="query">
<input TYPE="submit" value="Search"><br>
</form>
</CENTER>
<hr>
<a href = "home">home</a>
</body>
</html>
Auth.java
@WebServlet("/authenticate")
public class Auth extends HttpServlet {
@Override
public void doPost(HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
String servletPath = (req.getAttribute("url") != null) ?
((String)req.getAttribute("url")).replaceFirst("/", "") : "home";
if(AuthUtilities.authenticate(userName, password)) {
res.sendRedirect(servletPath);
}
else
res.sendRedirect("login");
}//end of doPost method
public void doGet(HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
RequestDispatcher dis = req.getRequestDispatcher("login");
dis.forward(req, res);
}//end of doGet method
}//end class
login.jsp
<%@ page import="com.myapp.app.AuthUtilities" %>
<!doctype html>
<html>
<head>
<title>Login</title>
</head>
<body>
<form action="authenticate" method="POST">
<label for="username">Username</label>
<input type="text" name="username"><br>
<label for="password">Password</label>
<input type="password" name="password"><br>
<% if(request.getAttribute("url") != null) { %>
<input type="hidden" value="<%= request.getAttribute("url") %>" name="url"><br>
<% } %>
<input type="submit" value="login">
</form>
<p>Not a member? <a href="signup">Sign Up Now</a></p>
</body>
</html>
isLoggedIn() メソッド
public static String isLoggedIn(HttpSession session, HttpServletRequest req) {
String userName = (String)session.getAttribute("username");
if(userName != null)
userName = "You are logged in as <a href='profile'>"+
userName + "</a> | " +
"<a href='logout'>Logout :(</a>";
else
userName = "<a href=\"authenticate?url="+req.getServletPath()+"\">Login</a>";
return userName;
}