3

我有一个登录 servlet,成功登录后,我希望用户

/登录/{用户名}/

如何username在 URL 中放置 POST 请求?

我已经查找了一些类似thisthis的答案,但无法理解如何真正实现我的目标。我想坚持使用 servlet,避免使用 JAX-RS 等技术。

这是我的登录逻辑实现:

   private void login_doIT(HttpServletRequest request, HttpServletResponse response) throws SQLException, InvalidKeySpecException, NoSuchAlgorithmException, ServletException, IOException {
    String userInput = request.getParameter("user_name");
    String pass = request.getParameter("pass");
    pst = c.prepareStatement(query);
    pst.setString(1,userInput);
    rs = pst.executeQuery();
    while (rs.next()){
        imiya = rs.getString("user_name");
        kyuch = rs.getString("key");
        kodom = rs.getBytes("nitrate");
    }
    EncryptClass instance = new EncryptClass(2048,100000);
    if(instance.chkPass(pass,kyuch,kodom) && imiya.equals(userInput)){
        HttpSession session = request.getSession();
        session.setAttribute("userLogged",userInput);
        request.setAttribute("title",userInput);
        String pathInfo = request.getPathInfo();
        if(pathInfo!=null || !pathInfo.isEmpty()){
            String[] pathArr = pathInfo.split("/");
            String val = pathArr[1];//{username}
          //now what??.....
        }
        request.getRequestDispatcher("/LoginLanding.jsp").forward(request,response);
    } else {
        request.setAttribute("message", message);
        request.getRequestDispatcher("/index.jsp").include(request,response);
    }
}

这是它的 web.xml:

<servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>AuthPack.ServletLogin</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/Login/*</url-pattern>
</servlet-mapping>

在我提交表单后,URL 变成了类似

/登录

但我想要这样:

/登录/{用户名}

更优选:

/{用户名}

4

2 回答 2

1

您必须使用 url 重写器或过滤器。

这是使用过滤器方法的示例:

在您的登录 servlet中,而不是去 loginLanding.jsp ,您重定向到过滤器,如下所示

//REDIRECT TO filter 
response.sendRedirect("/user/"+userInput);

创建过滤器与创建 servlet 非常相似,您可以选择创建这样的映射 ( web.xml ):

  <filter>
    <display-name>UserFilter</display-name>
    <filter-name>UserFilter</filter-name>
    <filter-class>filters.UserFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>UserFilter</filter-name>
    <url-pattern>/user/*</url-pattern>
  </filter-mapping>

您的过滤器应如下所示:

public class UserFilter implements Filter {

public UserFilter() {
}

public void destroy() {
}

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      String requri = ((HttpServletRequest) request).getRequestURI().substring(((HttpServletRequest) request).getContextPath().length() + 1);
        HttpSession session = (((HttpServletRequest) request).getSession());

        String RequestedUsername = null;

        if(requri.contains("user/")){
          //get the username after "user/"
          RequestedUsername=requri.substring(5);
          if(!RequestedUsername.isEmpty()){
           //if not empty set session
           session.setAttribute("loggedInUser",RequestedUsername);
             }
        }

      //forward to servlet which will set user details etc... (just get the user session variable from there) in that servlet you forward to landinglogin.jsp
      request.getRequestDispatcher("/profile").forward(request, response);


     }
于 2017-09-22T16:46:26.177 回答
0

在此代码中,您希望参数在 HttpServletRequest.getParameter() 中可用,可从 servlet 中的 doPost() 方法访问:

String userInput = request.getParameter("user_name");
String pass = request.getParameter("pass");

但是您没有显示您是 a) 将请求作为 POST 提交还是 b) 从 servlet 中的 doPost() 调用访问这些请求。

您可以使用 HttpServletRequest.getPathInfo() 访问路径上的参数信息(请参阅此链接

String extraPathInfo = request.getPathInfo();
// If extraPathInfo is not null, parse it to extract the user name
String pass = request.getParameter("pass");

如果您的 servlet 在 /login 可用,并且您将用户名附加到该位置(如 /login/someUser/),则 getPathInfo() 将返回它,但您可能需要检查它是否包含斜杠。

顺便说一句,为登录功能执行此操作会产生安全漏洞。与其将用户名放在路径上,不如简单地将用户名和密码作为 POST 参数发送。

于 2017-09-22T16:34:41.663 回答