해지말라고
397
2019-07-13 15:21:13 작성 2019-07-13 17:07:18 수정됨
5
323

session 생성 질문입니다.


안녕하세요 스프링 실습 중에 제대로 진행이 안되는 것이 있어서 질문드리러 왔습니다.

현재 세션과 쿠키를 이용해서 로그인 하는 예제를 만들고 있습니다.

프로세서는 /첫화면 > /login > interceptor > /view?menu=m10(로그인 후 화면) 이런 식입니다.

처음 /login에서 setAttribute로 세션 정보를 추가 한 후 getAttribute로 제대로 적용됐는지 확인을 했습니다.


현재 문제는 interceptor에서 

HttpSession session = request.getSession(false);

Object object = session.getAttribute("loginInfo");

이 부분에서 정보를 가져올 때 session 상태가 null인 상황입니다.


제 지식이 부족한 것이 많아 뭔가 빠트리거나 세션에 대해 이해를 잘 못한것 같아 헤매다 질문글 올려봅니다.

이 상황에서 어떤점이 잘못 되었는지 알고싶습니다.

아래는 /login 컨트롤러와 interceptor입니다.


@RequestMapping("/login")
	public @ResponseBody Map<String, Object> login(@RequestParam Map<String, Object> param,HttpServletRequest request, HttpServletResponse response) throws Exception{
		// 기존 세션 값 존재시 제거 
		if(request.getAttribute("loginInfo") != null) {
			request.removeAttribute("loginInfo");
		}
		
		System.out.println("LoginContorller param >>> " + param.toString());
		map = loginService.selectLoginCheck(param);
		
		if(map != null) { // 로그인 성공
			// 쿠키 추가 
			request.setAttribute("loginInfo", map);
			System.out.println(request.getAttribute("loginInfo").toString());
			 // 만약 체크박스가 on으로 표기되어 있을 시 
			 if(param.containsKey("checkbox")) {
				if(param.get("checkbox").equals("on")) {
					Cookie cookie = new Cookie("loginCookie", request.getSession().getId());
					cookie.setMaxAge(amount);
					response.addCookie(cookie);
					
					// currentTimeMills()가 1/1000초 단위임으로 1000곱해서 더해야함
	                Date sessionLimits = new Date(System.currentTimeMillis() + (1000*amount));
	                map.put("userIdx", map.get("id"));
	                map.put("sessionLimits", sessionLimits);
	                map.put("sessionKey", request.getSession().getId());
	                
	                loginService.updateLoginCookie(map);
	                
				}
			}
			
			System.out.println("LoginController loginInfo >>>> " + map.toString()) ;
			return map;
		}else {
			
			return map;
		}
		
	}



@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		// 세션 존재 시 데이터 반환 없으면 null 반환
		HttpSession session = request.getSession(false);
		
		
		Object object = session.getAttribute("loginInfo");
		
		//login session 이 없을 경우
		if(object == null) {
			Cookie loginCookie = WebUtils.getCookie(request, "loginCookie");

			if( loginCookie != null) {			// 쿠키가 존재하는 경우
				// 생성 되어있던 쿠키, 즉 세션ID값을 가져와
				String sessionId = loginCookie.getValue();
				// 세션값에 이전에 로그인 한 적이 있는지 여부 또한
				// 유효기간 > now()인 경우의 조건을 만족하는 사용자 정보 반환
				param.put("sessionKey", sessionId);
				map = loginService.setSessionCheck(param);
				if(map != null ) { // 사용자 존재 시 
					session.setAttribute("loginInfo", map);
					return true;
				}
			}
			response.sendRedirect("/app");
			return false;
		}
		return true;
		
	}


0
0
  • 답변 5

  • 사는게힘듭니다
    2019-07-13 16:59:35

    request.removeAttribute는 세션의 값을 제거하는게 아닙니다.

    0
  • 해지말라고
    397
    2019-07-13 17:09:46

    사는게힘듭니다 

    지적해 주신 부분 수정하도록 하겠습니다.

    혹시 제가 겪고 있는 문제에 대해서 해결법을 알고 계신가요?

    0
  • 사는게힘듭니다
    2019-07-13 17:17:24

    login을 했을때 기존세션값을 지우시는거보다

    로그아웃 버튼을 클릭했을때 세션을 지우세요.


    0
  • 해지말라고
    397
    2019-07-13 17:37:16

    그 문제는 현재 소스에서 문제가 되지 않는 것 같습니다.

    제가 겪고 있는 문제는 

     interceptor에서 

    HttpSession session = request.getSession(false);

    Object object = session.getAttribute("loginInfo");

    이 부분에서 세션 정보를 가져올 때 session 상태가 null인 상황입니다.

    0
  • 사는게힘듭니다
    2019-07-13 17:56:59

    인터셉터 내부에 map이라는 변수선언부가 어디있나요?

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.