Как разместить такие параметры, как /login/{param}/ для почтового запроса в сервлетах

У меня есть сервлет входа в систему, и после успешного входа я хочу, чтобы пользователь

/логин/{имя пользователя}/

Как разместить username в URL-адресе для POST-запроса?

Я просмотрел некоторые ответы, такие как это и это, но не мог понять, как на самом деле достичь моей цели. Я хотел бы придерживаться использования сервлетов и воздерживаться от использования таких технологий, как 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 станет чем-то вроде

/авторизоваться

Но я хочу так:

/логин/{имя пользователя}

более предпочтительно:

/{имя пользователя}


person Shankha057    schedule 22.09.2017    source источник
comment
Первая ссылка кажется решением. В чем именно проблема? Лучше всего показать нам свой код.   -  person vanje    schedule 22.09.2017


Ответы (2)


вы должны использовать переписчик URL или фильтр.

Вот пример использования метода фильтра:

в вашем сервлете входа вместо входа в loginLanding.jsp вы перенаправляете на фильтр следующим образом:

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

Создание фильтра очень похоже на создание сервлета, и вы можете создать такое сопоставление (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);


     }
person Jonathan Laliberte    schedule 22.09.2017

В этом коде вы ожидаете, что параметры будут доступны в HttpServletRequest.getParameter(), доступном из метода doPost() в вашем сервлете:

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

Но вы не показываете, а) отправляете ли вы запрос как POST или б) получаете к ним доступ из вызова doPost() в вашем сервлете.

Вы можете получить доступ к информации о параметрах пути с помощью HttpServletRequest.getPathInfo() (см. эта ссылка)

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

Если ваш сервлет доступен в /login и вы добавляете к нему имя пользователя (например, /login/someUser/), то getPathInfo() вернет его, хотя вы можете проверить, включает ли это косую черту.

Кроме того, выполнение этого для функции входа в систему создает уязвимость в системе безопасности. Вместо того, чтобы указывать имена пользователей в пути, лучше просто отправить имя пользователя и пароль в качестве параметров POST.

person Michael Peacock    schedule 22.09.2017