编辑:
好的,我会尝试简化这个解释,因为我似乎无法在网上找到任何资源,而且我第一次解释它时做得很糟糕。我的目标是:
从任何 JSP 开始(它可以是用户可以在站点中访问的任何地方),但为了论证,让我们说index.jsp
. 用户试图做一些需要登录的事情,因此在另一个名为login.jsp
. 现在,用户通过提交发送到身份验证 servlet 的表单来登录,并且他们被重定向回原来的位置,但在本例中index.jsp
。现在我在下面解释我到目前为止所做的事情。我尝试了 Session 但有一种奇怪的古怪行为导致我无法通过它发送 URL。我也不想通过 GET 附加 URL,因为这样做会显示它并且它看起来很丑。是否可以在向用户隐藏该逻辑的同时做到这一点?
到目前为止,我尝试过的是任何时候页面将引导用户登录,我附加 URL 但将其发送到我的Authenticate.java
servlet。它在那里调用doGet()
重定向到登录的 ,因此我可以login.jsp
从request
变量中访问它。问题是 URL 甚至没有指向login.jsp
我的身份验证 servlet 和附加的 url。所以应该是:
http://localhost:8080/app/login
但它说
http://localhost:8080/app/authenticate?url=/index.jsp
我将提供我的代码,这样它就更有意义了。如果需要任何解释,请不要犹豫!谢谢。
更新:
好的,看来我需要更新/为了解决 Hardik Mishra 的担忧,我为重定向而道歉。我一般/松散地使用了这个术语,因为重定向到我可能意味着只是通过引导另一个页面传递一些信息,因为它是一个控制器。如您所见,我显然使用的是RequestDispatcher
. 我有足够的能力阅读文档,因此我可以说响应有一种sendRedirect()
我可以使用的方法。但就像我上面提到的,出于上述原因,我不想使用 Session。sendRedirect()
不一样request
我丢失了信息。但是由于您也对我从哪里获得这些 URL 感到困惑,所以我将提供一个调用 JSP 的示例。我从来没有包含它的原因是因为在被要求登录之前,无论他们正在与哪个 JSP 交互,始终将用户带回到他们原来的位置。为清楚起见,将在上面添加我使用的示例 JSP Auth.java
。看来我过早地添加isLoggedIn()
了AuthUtilities
,这可能又增加了混乱,所以再次道歉。
索引.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>
验证.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
登录.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;
}