본문 바로가기

Server Oriented/Spring

스프링, 세션과 쿠키

#1 Controller..

@Controller

@RequestMapping("/auth")

public class LoginContoller{

 

  @GetMapping("/login")

  public String loginForm(LoginInput loginInput){

    return "loginForm";

  }

 

  @PostMapping("/login")

  public String login(LoginInput loginInput, HttpSession session){

    ...

    UserInfo ui = new UserInfo("Gil-dong");

    session.setAttribute("userInfo",ui);

    ...

    return "...";

  }

 

  @GetMapping("/logout")

  public String logout(HttpSession session){

    UserInfo ui = (UserInfo)session.getAttribute("userInfo");

    session.invalidate();

    return "...";

  }

 

}

 

@Getter @Setter

public class UserInfo{

  private String name;

  public UserInfo(name){

    this.name = name;

  }

}

 

@PostMapping("/login")

public String login(LoginInput loginInput, HttpServletRequest request){

  ...

  HttpSession session = request.getSession();// request 객체에서 session 객체를 가져오기

  UserInfo ui = new UserInfo("Gil-dong");

  session.setAttribute("userInfo",ui); // request 객체에 session 객체를 다시 넣지 않아도 반영됨

  return "...";

}


#2 View..

<th:block th:if="${session.userInfo == null}">

 <a href="@{/auth/login}">로그인</a>

</th:block>

<th:block th:if="${session.userInfo != null}">

 <p>[[${session.userInfo.name}]] 님, 환영합니다</p>

</th:block>

스프링 타임리프에게는 세션도 일반적인 자바빈즈와 동일한 접근.

자바빈즈와 다른 접근은 메시지(message.properties)


상기 본문에선 사용자 정보를 기준으로 로그인과 로그아웃을 설명했는데,

상품 정보를 기준으로 카트 정보를 세션에 담아서 처리할 수 있다.


// HttpSession 이나 HttpServletRequest 사용없이 세션에 해당 객체를 담아준다

@PostMapping("/login")

public String login(@SessionAttribute ObjectA objA){

  ...

  //objA = (ObjectA)session.getAttribute("objectA");

  //objA 가공

  //session.setAttribute("objectA",objA);

  ...

  return "...";

}

 

// method 파라미터에 objectA 가 기술되면, 이를 Model 에 넣고 session 에 담아준다

@Controller

@SessionAttributes("objectA")

@RequestMapping("...")

public class TestController{

  ...

}


public String loginForm(LoginInput loginInput, @CookieValue(value="name") Cookie nameC){

  if(nameC!=null){

    loginInput.setName(nameC.getValue());

  }

}

 

@PostMapping("...")

public String login(LoginInput loginInput, HttpSession session, HttpServletResponse response){

  Cookie nameC = new Cookie("name", loginInput.getName());

  nameC.setPath("/");

  nameC.setmaxAge(초단위); // 30일 = 30 * 24시간 * 60분 * 60초

  response.addCookie(nameC);

  return "...";

}