web developer

[java] 로그인 시 HttpSession에 저장한 사용자 정보, JSP EL로 어디서나 접근하기 본문

Language/Java

[java] 로그인 시 HttpSession에 저장한 사용자 정보, JSP EL로 어디서나 접근하기

trueman 2024. 11. 22. 10:37
728x90
728x90

로그인 시 HttpSession에 userinfo 객체를 저장했다면, 같은 세션을 공유하는 모든 요청에서 JSP에서 ${userinfo.user_id}로 접근 가능합니다. 즉, 사용자가 로그인한 뒤, userinfo가 세션에 저장되었다면, board.do이든 board_view.do이든 요청 경로와 상관없이 동일한 세션에 저장된 데이터를 사용할 수 있습니다.


HttpSession은 사용자와 서버 간의 지속적인 상태를 관리하는 객체입니다. 사용자가 로그인 시점에 userinfo를 세션에 저장했다면:

  1. 세션의 유지:
    • 브라우저는 세션 ID를 쿠키에 저장하고, 모든 요청마다 이 세션 ID를 서버로 전달합니다.
    • 서버는 전달받은 세션 ID를 통해 해당 사용자의 HttpSession 객체를 식별하고, 저장된 데이터를 제공합니다.
  2. 공통 데이터 접근:
    • 세션에 저장된 데이터는 사용자의 모든 요청에서 접근 가능합니다.
    • JSP에서 ${userinfo}를 통해 세션에 저장된 데이터를 EL(Expression Language)을 사용해 바로 읽을 수 있습니다.

로그인 처리 코드 (LoginController.java):

@RequestMapping("/login.do")
public String login(HttpServletRequest request, Model model) {
    UserInfo userinfo = userService.authenticateUser(request.getParameter("username"), request.getParameter("password"));
    if (userinfo != null) {
        HttpSession session = request.getSession();
        session.setAttribute("userinfo", userinfo); // 세션에 저장
        return "redirect:/m86.do"; // 로그인 성공 시 페이지 이동
    } else {
        model.addAttribute("errorMessage", "Invalid username or password");
        return "login";
    }
}


JSP 코드

<c:if test="${not empty userinfo}">
    <p>안녕하세요, ${userinfo.user_id}님!</p>
</c:if>
<c:if test="${empty userinfo}">
    <p>로그인이 필요합니다.</p>
</c:if>

주의할 점

  1. 로그인하지 않은 상태:
    • HttpSession에 userinfo가 설정되지 않았다면, JSP에서 ${userinfo.user_id}는 null을 반환하거나, 접근 시 NullPointerException을 발생시킬 수 있습니다.
    • 이를 방지하려면 JSP에서 null 체크를 추가하는 것이 좋습니다.
  2. 세션의 만료:
    • 사용자가 로그인 후 일정 시간이 지나 세션이 만료되면, userinfo 데이터에 접근할 수 없게 됩니다. 이 경우, 사용자에게 다시 로그인하도록 안내해야 합니다.
  3. 세션 충돌:
    • 동일 브라우저에서 다른 계정을 사용해 로그인하면 이전 세션 데이터가 덮어씌워질 수 있습니다. 이를 방지하려면 세션 관리에 신경 써야 합니다.

결론

session.setAttribute("userinfo", userinfo);를 통해 세션에 userinfo를 저장했다면, 세션이 유지되는 한 모든 JSP에서 ${userinfo.user_id}와 같이 접근할 수 있습니다. 다만, 로그아웃 처리나 세션 만료 시에는 이에 대한 대처를 해주는 것이 좋습니다.

728x90
728x90