设计问题 - 重定向网址

时间:2010-01-07 08:03:23

标签: jsp servlets

我是一名新手servlet程序员。我正在努力做到这一点。

我编写了一个过滤器来拦截servlet请求并检查URL是否需要用户登录。如果是这样,用户将被定向到登录页面。这很有效。但后来我想首先将用户重定向回他想去的页面。保持这种状态的正确方法是什么?我是否只是将URL存储在使用cookie中的会话ID索引的数据结构中?

3 个答案:

答案 0 :(得分:2)

您可以将其存储在会话中,也可以将其附加到登录网址。

http://www.myexample.com/login.jsp?from=mypage.jsp

如果它有路径和文件名,请确保url encode它(用适当的转义值(%xx)替换/,&,=等)。

http://www.myexample.com/login.jsp?from=mydir%2Fmypage.jsp

答案 1 :(得分:1)

不要重新发明轮子。 Servlet API支持基于用户/角色的身份验证和安全性。 Tomcat(以及其他)包括built in support for authenticating使用各种来源:xml文件,数据库,LDAP等。

答案 2 :(得分:1)

  

我编写了一个过滤器来拦截servlet请求并检查URL是否需要用户登录。

这似乎听起来不对。您应该将Filter映射到url-pattern的同一Servlet,或者更好地映射到servlet-name的{​​{1}}。这样,只要调用Servlet,就会调用Filter

回到实际问题:当用户未登录时,您有两个选择:

  1. 将网址存储在会话中:

    Servlet
    您在登录时使用的

    if (session.getAttribute("user") == null) {
        session.setAttribute("back", httpRequest.getRequestURI());
        httpRequest.sendRedirect("login");
    } else {
        chain.doFilter(request, response);
    }
    
  2. 将URL作为请求参数传递:

    User user = userDAO.find(username, password);
    if (user != null) {
        session.setAttribute("user", user);
        String back = (String) session.getAttribute("back");
        if (back != null) {
            session.removeAttribute("back");
            response.sendRedirect(back);
        } else {
            response.sendRedirect("home"); // Home page?
        }
    } else {
        // Show error?
        request.setAttribute("message", "Unknown user, please retry");
        request.getRequestDispatcher("login").forward(request, response);
    }
    

    您将其作为隐藏输入字段传递给后续请求:

    if (session.getAttribute("user") == null) {
        httpRequest.sendRedirect("login?back=" + httpRequest.getRequestURI());
    } else {
        chain.doFilter(request, response);
    }
    
    您在登录时使用的

    <input type="hidden" name="back" value="${param.back}">
    
  3. 由于getRequestURI()无法解码,因此不需要进行某些建议的网址编码。