0

编辑:

好的,我会尝试简化这个解释,因为我似乎无法在网上找到任何资源,而且我第一次解释它时做得很糟糕。我的目标是:

从任何 JSP 开始(它可以是用户可以在站点中访问的任何地方),但为了论证,让我们说index.jsp. 用户试图做一些需要登录的事情,因此在另一个名为login.jsp. 现在,用户通过提交发送到身份验证 servlet 的表单来登录,并且他们被重定向回原来的位置,但在本例中index.jsp。现在我在下面解释我到目前为止所做的事情。我尝试了 Session 但有一种奇怪的古怪行为导致我无法通过它发送 URL。我也不想通过 GET 附加 URL,因为这样做会显示它并且它看起来很丑。是否可以在向用户隐藏该逻辑的同时做到这一点?


到目前为止,我尝试过的是任何时候页面将引导用户登录,我附加 URL 但将其发送到我的Authenticate.javaservlet。它在那里调用doGet()重定向到登录的 ,因此我可以login.jsprequest变量中访问它。问题是 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;
    }
4

2 回答 2

2

首先,您没有清楚地解释这个问题。从AuthServlet 我得到的是

http://localhost:8080/app/login 

但它说

http://localhost:8080/app/authenticate?url=/index.jsp

您将在成功时重定向到所需的页面(有效凭据),如果使用重定向无效则重定向到“login.jsp” doPost()

到目前为止,我尝试过的是任何时候页面将引导用户登录,我附加 URL 但将其发送到我的 Authenticate.java servlet。在那里它调用重定向到登录的 doGet(),因此我的 login.jsp 可以从请求变量访问。问题是 URL 甚至没有指向 login.jsp,而是指向我的身份验证 servlet 和附加的 url。

doGet()中,您不是重定向到登录页面,而是转发页面。(请参阅Jsp forward 和 redirect 之间的区别)。

因此,对于您的情况,浏览器 URL 将不会更新,您也可以访问请求对象中的属性。因此,在 中存储价值并在中HttpSession使用。response.sendRedirectdoGet()

另一种request.getHeader("Referer")从请求标头获取 JSP 页面的方法,但不建议这样做,因为发送Referer 可能会被防火墙或浏览器配置阻止。

于 2013-03-05T10:45:26.097 回答
0

除了重定向到login之外,您还可以传递一个附加参数“refererurl”,如果登录成功,它将告诉您需要重定向的 url。

  @Override
    public void doPost(HttpServletRequest req, 
        HttpServletResponse res) throws ServletException, IOException {

        String urlToRedirectAfterLogin = req.getParameter('refererurl');

        String servletPath = (req.getAttribute("url") != null) ?
            ((String)req.getAttribute("url")).replaceFirst("/", "") : "home";

        if(AuthUtilities.authenticate(userName, password)) {
            res.sendRedirect(urlToRedirectAfterLogin);
        }
        else{
            String fullURL = request.getRequestURL().append("?")
.append(request.getQueryString()).toString();
        res.sendRedirect("login"+"?refererurl="+fullURL);

            }

    }//
于 2013-03-05T10:45:05.810 回答