2016-01-07 2 views
1

Когда я вызываю doPost напрямую, он показывает мне страницу профиля правильным образом. Но после регистрации я открываю новую вкладку в Chrome Копировать URL «http://localhost:8080/17_servlets_jsp/profile» там и он показывает мне пустую страницуНе могу позвонить doPost из doGet

@WebServlet("/profile") 
public class Profile extends HttpServlet { 
**private String login;** 
private HttpSession httpSession; 
private User user; 
private Role role; 
public static Logger LOGGER = LogManager.getLogger(Profile.class.getName()); 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    resp.setContentType("text/html"); 
    httpSession = req.getSession(); 
    try (PrintWriter out = resp.getWriter()) { 
     **if (httpSession.getAttribute("userLoggedIn") == null) { 
      out.println("<title>Login Page</title>"); 
      out.println("<p><a href=\"index\">Please follow the link to login</a></p>"); 
     } else { 
      login = (String) httpSession.getAttribute("uLogin"); 
      doPost(req, resp); 
     }** 
    } catch (IOException | NullPointerException e) { 
     LOGGER.error(e); 
    } 
} 

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    **login = req.getParameter("login"); 
    user = new ImplUserDAO().findByLogin(login);** 
    httpSession = req.getSession(); 
    resp.setContentType("text/html"); 
    try (PrintWriter out = resp.getWriter()) { 
     out.println("<title>Profile page</title>"); 
     if (user != null && user.getPassword().equals(req.getParameter("pass"))) { 
      role = new ImplRoleDAO().findById(user.getRoleId()); 
      httpSession.setAttribute("userLoggedIn", true); 
      httpSession.setAttribute("uLogin",req.getParameter("login")); 
      httpSession.setAttribute("uPass",req.getParameter("pass")); 
      out.println("user id = " + user.getUserId()); 
      out.println("login = " + user.getLogin()); 
      out.println("password = " + user.getPassword()); 
      out.println("role = " + role.getRoleName()); 
      out.println("<form action=\"logout\" method=\"get\"/>" + 
        "<input type=\"submit\" value=\"Logout\"/>" + 
        "</form>"); 
      if (role.getRoleName().equals("admin")) { 
       httpSession.setAttribute("isAdmin", true); 
       out.println("<a href=\"admin\">Go to admin page</a>"); 
      } 
     } else { 
      out.println("Wrong login or password"); 
      out.println("<a href=\"index\">Please follow the link to login</a>"); 
     } 
    } catch (IOException | NullPointerException e) { 
     LOGGER.error(e); 
    } 
} 
} 
+0

Посещение HTTP: // локальный: 8080/17_servlets_jsp/профиль должен вызвать doGet, потому что это запрос както определение. Что вас беспокоит в таком поведении? –

+0

Да. Я знал это, но когда я вызываю doGet этим действием, я ожидаю, что doPost, если пользователь войдет в систему, или «Пожалуйста, следуйте ссылке для входа», если пользователь не зарегистрирован. –

+0

Избавиться от этих глупых блоков try-catch (это основная причина проблемы с пустой страницей) и переместить HTML-код в JSP (это основная причина того, что вы заставляете себя плохо работать). Избавьтесь от этих переменных экземпляра на основе запроса/сеанса (пока это не причина, но, безусловно, будет в будущем). Начните здесь, чтобы узнать, как правильно использовать сервлеты: http://stackoverflow.com/tags/servlets/info – BalusC

ответ

0

Позвонив doPost() вы также выполнить эту строку:

user = new ImplUserDAO().findByLogin(req.getParameter("login")); 

Какой будет сгенерировано Exception или вернуть null или что-то еще, потому что ваш запрос GET не включил этот параметр. Если вы хотите использовать doPost() вы должны получать логин или из сеанса или запроса:

String login = req.getParameter("login"); 
if(null == login) { 
    login = (String)httpSession.getAttribute("uLogin"); 
} 

или аналогичный.

атрибутов и параметры

В вашем закомментированноге коды, вы пытались решить эту проблему путем вызова setAttribute("login"... по вашему запросу. Хотя это законно, вы не можете получить это значение, вызвав getParameter(). Вместо этого вы должны были бы назвать «GetAttribute()` снова - который не имеет большого значения для получения непосредственно из сессии:

//Retrieve Parameter (been send into the servlet from outside) 
String login = req.getParameter("login"); 
if(null == login) { 
    //Retrieve Attribute you put into the request in doGet() 
    login = (String)req.getAttribute("login"); 
} 

Другой Edit

Вы имеете тот же вопрос с req.getParameter("pass") ,

Вы должны серьезно рассмотреть возможность разделения входа-процесса (проверка имя пользователя/пароль из запроса) из других функциональных возможностей (профиль отображения страницы) или реверс логику: У входа, установить пользователя в сессии в doPost() и в случае успешного вызова goGet()?

Полный пример кода

Рассмотрим эти изменения в некоторой степени исправить вашу логику:

@WebServlet("/profile") 
public class Profile extends HttpServlet { 

    // Don't use member variables on Servlets - they get reused for all users! 
    // private String login; 
    // private HttpSession httpSession; 
    // private User user; 
    // private Role role; 
    public static Logger LOGGER = LogManager.getLogger(Profile.class.getName()); 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    resp.setContentType("text/html"); 
    HttpSession httpSession = req.getSession(); 
    try (PrintWriter out = resp.getWriter()) { 
     if (httpSession.getAttribute("userLoggedIn") == null) { 
      out.println("<title>Login Page</title>"); 
      out.println("<p><a href=\"index\">Please follow the link to login</a></p>");    
     } 
     else { 
      User user = httpSession.getAttribute("userLoggedIn"); 
      Role role = httpSession.getAttribute("userRole"); 

      out.println("<title>Profile page</title>"); 
      out.println("user id = " + user.getUserId()); 
      out.println("login = " + user.getLogin()); 
      out.println("password = " + user.getPassword()); 
      out.println("role = " + role.getRoleName()); 
      out.println("<form action=\"logout\" method=\"get\"/>" + 
        "<input type=\"submit\" value=\"Logout\"/>" + 
        "</form>"); 
      if("true".equals(httpSession.getAttribute("isAdmin")) { 
       httpSession.setAttribute("isAdmin", true); 
       out.println("<a href=\"admin\">Go to admin page</a>"); 
      } 
     } 
    } catch (IOException | NullPointerException e) { 
     LOGGER.error(e); 
    } 
} 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     String login = req.getParameter("login"); 
     User user = new ImplUserDAO().findByLogin(login); 
     HttpSession httpSession = req.getSession(); 
     try (PrintWriter out = resp.getWriter()) { 
      if (user != null && user.getPassword().equals(req.getParameter("pass"))) { 
       Role role = new ImplRoleDAO().findById(user.getRoleId()); 
       httpSession.setAttribute("userLoggedIn", user); 
       httpSession.setAttribute("userRole", role); 
       if (role.getRoleName().equals("admin")) { 
        httpSession.setAttribute("isAdmin", true); 
       } 
       // Now refer to display part. 
       goGet(req, resp); 
      } else { 
       out.println("Wrong login or password"); 
       out.println("<a href=\"index\">Please follow the link to login</a>"); 
      } 
     } catch (IOException | NullPointerException e) { 
      LOGGER.error(e); 
     } 
    } 
} 
+0

Я добавил строки, чтобы установить это атрибут. Перед тем, как позвонить в doPost, они находятся под комментарием. Это не работает. Или я сделал это неправильно –

+0

атрибуты и параметры совершенно разные. вы можете getAttribute(), что вы setAttribute(), но вы не можете добавитьParameter() -> это данные извне. Прямой доступ к значению сеанса, хотя может работать. – Jan

+0

Извините, но не получил вас :) –

Смежные вопросы