[@SessionAttributes() 어노테이션]
- 서블릿 API(HttpSession)를 사용하지 않고 세션처리를 하기 위한 어노테이션
- 클래스 앞에 붙인다.
- 세션변수(세션 영역에 저장한 속성명)에 값을 저장하려면
컨트롤러 메소드의 매개변수중 모델계열(Model,Map,ModelMap) 을 추가하여 add계열("세변변수명",값)으로
저장하면 그 이름으로 세션영역에도 저장된다.(리퀘스트 영역뿐만 아니라) 즉, 별도로 세션영역에 저장하지 않아도 된다.
-얘는 @ModelAttribute 같이 사용해서 로그인 인증처리할 때 사용한다
예] @SessionAttributes("세션변수명")
※세션변수명이 여러 개 일 때
@SessionAttributes({"세션변수명1","세션변수명2",...})
-세션영역에서 값 읽어올때
컨트롤러 메소드(@ModelAttribute(value="세션변수명") String 세션값담을변수)
※만약 세션영역에 세션변수명이 저장되어 있지 않다면 무조건 에러
-세션 해제
컨트롤러 메소드(SessionStatus session){
session.setComplete();
}
[커멘드 객체 사용 유무] =>결론부터 말하면 커맨드객체사용하지 말고 map 사용해라!!!
1.커맨드 객체 사용 안하는 경우
@SessionAttribute({"속성명1","속성명2",...}) 속성명은 폼의 파라미터 명과 반드시 일치 시켜라
[로그인] - 모델계열에 사용자가 입력한 아이디와 비번을 저장하면 세션영역에도 저장된다
login(Model model,@RequestParam Map map){
회원 여부 판단후 회원이라면 model 에 map저장
회원이 아니라면 model에 에러메시지 저장
}
[로그아웃]
logout(SessionStatus status){
status.setComplete();
}
[로그인여부 판단]
isLogin(@ModelAttribute("속성명1") String id,Model model){
메소드 안으로 들어 온다는 얘기는 세션영역에 "속성명1" 존재한다는 말, 고로 로그인이 되었다.
세션영역에 "속성명1" 없다면 무조건 500에러 - @ExceptionHandler 나 설정파일로 에러 처리
model에 로그인되었다는 정보를 저장
}
2.커맨드 객체 사용하는 경우
-※빈 설정 파일에 <annotation-driven/>태그 추가
@SessionAttribute(types=커맨드객체 클래스명.class)
[로그인] - 아이디와 비번을 커맨드객체로 받는다.이 때 커맨드 객체는 회원이든 아니든 무조건 세션영역에 저장된다
세션 영역에 저장될때 소문자로 시작하는 커맨드객체 클래명(loginCommand)이 키값이 된다
value값은 당연히 커맨드 객체가 된다
login(Model model,LoginCommand cmd,SessionStatus status){
회원이 아닌 경우를 판단해서
세션영역에 저장 된 커맨드를 객체를 status.setComplete()로 삭제해한다
model에는 에러메시지 저장
}
[로그아웃]
logout(SessionStatus status){
status.setComplete();
}
[로그인여부 판단]
isLogin(@ModelAttribute("loginCommand") LoginCommad cmd,Model model){
위랑 동일
}
커맨드 객체 사용할 때 필요한 커맨드객체
public class LoginCommand {
//폼의 파라미터명과 일치 시키자
//※속성(멤버변수)는 소문자로 시작해야한다.
private String id;
private String pwd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
1.파라미터(아이디와 비번)을 맵으로 받을 때 (세션영역에 저장 할 속성명은 폼의 파라미터명과 일치시키기)
@SessionAttributes({"id","pwd"})
2.파라미터를 커맨드객체로 받을 때 (타입속성 꼭 필요함 !!! 이래야 커맨드 변수들이 세션영역의 키로 전환이 됨)
@SessionAttributes(types = LoginCommand.class )
@Controller
public class SessionAttributeController {
[서블릿 api 사용]
//로그인 처리
@RequestMapping("/Annotation/SessionAttributeLogin.do")
public String login(HttpSession session, @RequestParam Map map, Model model) {
//데이터저장
//회원여부 판단
if("KIM".equals(map.get("id")) && "1234".equals(map.get("pwd"))) {
session.setAttribute("id",map.get("id"));
}
else {
model.addAttribute("errorMessage", "아이디와 비밀번호 불일치");
}
//뷰정보 반환
return "annotation06/Annotation";
}
//로그인여부 판단
@RequestMapping("/Annotation/SessionAttributeIsLogin.do")
public String isLogin(HttpSession session,Model model){
//로그인여부판단-세션영역에 존재 유무로 판단 후 데이터저장
model.addAttribute("isLoginMessageAPI",session.getAttribute("id")==null? "로그인하세요" : "로그인되었습니다.");
//뷰정보반환
return "annotation06/Annotation";
}
//로그아웃
@RequestMapping("/Annotation/SessionAttributeLogout.do")
public String logout(HttpSession session) {
//로그아웃처리 -세션 영역에 저장된 속성 삭제
session.invalidate();
//뷰정보반환
return "annotation06/Annotation";
}
[@SessionAttribute 어노테이션 사용]
//먼저 로그인여부판단에서 나타나는 에러 잡기!!!
@ExceptionHandler({Exception.class})
public String error(Model model) {
model.addAttribute("isLoginMessage","로그인 후 이용하세요");
//뷰정보 반환
return "annotation06/Annotation";
}
//1.파라미터를 맵으로 받을 때
//로그인 처리
@RequestMapping("/Annotation/SessionAttributeLogin.do")
public String login(@RequestParam Map map, Model model) {
//데이터저장
//회원여부 판단
if("KIM".equals(map.get("id")) && "1234".equals(map.get("pwd"))) {
//로그인처리-세션영역에 필요한 값 저장
//@SessionAttributes 사용 시 세션 및 리퀘스트 두 영역에 동시에 저장 됨. 우와!!!
model.addAllAttributes(map);
}
else {
model.addAttribute("errorMessage", "아이디와 비밀번호 불일치");
}
//뷰정보 반환
return "annotation06/Annotation";
}
//로그인여부 판단 세션영역에 반드시 id라는 속성 존재해야 함 !!!!
@RequestMapping("/Annotation/SessionAttributeIsLogin.do")
public String isLogin(@ModelAttribute("id") String id, Model model){
//로그인여부판단-세션영역에 존재 유무로 판단 후 데이터저장
model.addAttribute("isLoginMessage",id+"님 로그인 되었습니다.");
//뷰정보반환
return "annotation06/Annotation";
}
//로그아웃
@RequestMapping("/Annotation/SessionAttributeLogout.do")
public String logout(SessionStatus status) {
//로그아웃처리 -세션 영역에 저장된 속성 삭제
status.setComplete();
//뷰정보반환
return "annotation06/Annotation";
}
//2.파라미터를 커맨드객체로 만들 때 ! ==> 커맨드 만들어야지 위에 만들어 놓음!
//로그인 처리
@RequestMapping("/Annotation/SessionAttributeLogin.do")
public String login(LoginCommand cmd, Model model,SessionStatus status) {
/* 데이터저장
회원여부 판단
세션영역에 저장될 때 속성은 자동으로 소문자로 시작하는 커맨드 클래스명이 키값이 된다.
LoginCommand객체가 무조건(회원이든 아니든..???!!)자동으로 세션 영역에 저장이 됨
(예. session.setAttribute("loginCommand",cmd)식으로 저장됨)
그래서 회원이 아닌경우는 세션 영역에서 삭제해야한다. */
if(!(cmd.getId().equals("KIM")&& cmd.getPwd().equals("1234"))) {
//무조건 커맨드객체를 세션영역에 저장하기 때문에
//회원이 아닌 경우는삭제해 줘야한다.
status.setComplete();
model.addAttribute("errorMessage","아이디와 비밀번호 불일치 !");
}
//뷰정보반환
return "annotation06/Annotation";
}
//로그인여부 판단 세션영역에 반드시 id라는 속성 존재해야 함 !!!!
@RequestMapping("/Annotation/SessionAttributeIsLogin.do")
public String isLogin(@ModelAttribute("loginCommand") LoginCommand cmd, Model model){
//로그인여부판단-세션영역에 존재 유무로 판단 후 데이터저장
model.addAttribute("isLoginMessage",cmd.getId()+"님 로그인 되었습니다.");
//뷰정보반환
return "annotation06/Annotation";
}
//로그아웃
@RequestMapping("/Annotation/SessionAttributeLogout.do")
public String logout(SessionStatus status) {
//로그아웃처리 -세션 영역에 저장된 속성 삭제
status.setComplete();
//뷰정보반환
return "annotation06/Annotation";
}
}
'학원 > SPRING' 카테고리의 다른 글
12/12 62-1 [SPRING] 오라클 연결하기(Database) (0) | 2022.12.12 |
---|---|
12/09 61-4 [SPRING] @ResponseBody/@RequestBody/@RequestHeader (0) | 2022.12.10 |
12/09 61-2 [SPRING] @Lazy/component-scan최종정리 (0) | 2022.12.10 |
12/09 61-1 [SPRING] @Autowired/@Resource (1) | 2022.12.09 |
12/08 60-2 [SPRING] @어노테이션 (0) | 2022.12.08 |