[@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";
    }
}

+ Recent posts