로그인하면 정보를 보내야 하는데....나는 왜이렇게 뭉게 구름같을까????

내가한거 정리하는 차원에서....ㅠㅠ

1.

// controller
	@PostMapping(value="/member/login.do")
	public String getLogin(@RequestParam String email, @RequestParam String pw,
			HttpServletRequest request, Model model) {

		MemberDTO loginDto = mService.getMemberLogin(email, pw);
  		if(loginDto.getId() != 0) {  
            HttpSession session = request.getSession();
            session.setAttribute("id",loginDto.getId());
            session.setAttribute("nickName",loginDto.getNickName());
          	model.addAttribute("session",session);
            return "member/myInfo";
        }else { //회원정보안나오면 에러처리
            model.addAttribute("msg", "회원정보가 없습니다.");
            model.addAttribute("url", "/member/myInfoView.do");
            return "common/alert";
        }	
   }
  
  //jsp 화면
<% session=request.getSession();%>
//맨위에 한줄 넣고
<c:choose>
    <c:when test="${session.getAttribute('nickName') ne null }">
        <p>${session.getAttribute('nickName')}님
    </c:when>
    <c:when test="${session.getAttribute('nickName') eq null }">
        <c:out value="로그인 필요"/>
    </c:when>
</c:choose>
// 로그인정보를 쓰는 내용을 구상

근데 문제가 있다.......... 이 정보를 header페이지에 넣고 다른 페이지에 모두 include를 했는데.....처음 같 페이지 말고는 다시 읽어들이지를 않는것이다...

session은 다른 페이지는 고냥 얻어지는 것이 아닌것인가????

고민을 거듭....검색을 거듭하여...

https://ohju.tistory.com/869 이분 글을 참조하여 다시 코딩해보았다.

 

반영이 되는건 확인.....

홈화면으로 갈때도 로그인 정보가 콘솔로 나온다.....근데...이걸 jsp에서 나오는데 이걸 어떻게 이용해야하는것인가???

사실 많은 검색으로 장황하게 코드만 벌려 놓기도 했는데 ..

결론은 앞서 한것도 상관은 없는듯 하다......일단 너무 많이 벌려 놔서 저렇게 심플하게 다시 돌아가기에는 노력에 발목을 잡는다...버리기 아까움...ㅋㅋㅋㅋ 이런태도 안좋은줄 압니다...ㅋㅋㅋㅋㅋ

일단 정리.

1. 로그인 정보를 저장할 클래스를 만든다. 이걸 하면.  @SessionAttribute 불러 올때 편한다.

public interface SessionConst {
	/*
	 * Session을 다룰 때 글자만 참고-사용하기위해 상수를 인터페이스로 생성 직접 사용하지는 않는다.
	 */
	String LOGIN_MEMBER = "userDTO";
}

2. 간단한 환경 설정을 properties에다 준비.

# 세션 유지 시간을 설정한다. 초 단위로 적용된다.
server.servlet.session.timeout=1800

#URL 전달 방식을 끄고 항상 쿠키를 통해 세션을 유지한다.
server.servlet.session.tracking-modes=cookie

 쿠키로도 할수 있다는 데 오늘은 세션만 했다....세션이 좋다...나는 쿠키 생성은 내일이나 모레정도 예정

3. 메인화면들어갈때부터 session여부를 체크하여 진행한다.나는 index이라서....

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String welcome(
		@SessionAttribute(name=SessionConst.LOGIN_MEMBER, required=false) MemberDTO mDto
		, Model model){
		//Session 여부를 체크한다
		// @SessionAtrribute를 통해 위에서 Session에 값을 저장한 상수를 불러와 사용한다.
		if(mDto == null) {
			LOGGER.info("로그인 정보 없음 ");	
			return "index";
		} else {
			LOGGER.info("로그인 정보 : " + mDto);	
			model.addAttribute("MemberDTO" , mDto);
			LOGGER.info("보낼정보 : " + model);
		return "index";
		}
	}

 

4. 로그인하려 가볼까나.....

/* 로그인 */
	@PostMapping(value = "/member/login.do")
	public String getLogin(@RequestParam String email, @RequestParam String pw, HttpServletRequest request,
			Model model) {
		//내가 받은 정보
		LOGGER.info("[로그인 정보] pw ={}, email = {} ms", pw, email, (System.currentTimeMillis() - startTime));
	
		MemberDTO loginDto = mService.getMemberLogin(email, pw);
		//정보 db 가져와서 pw 맞는지 확인
		if (!(loginDto.getPw().equals(pw))) {
			model.addAttribute("msg", "비밀번호가 다릅니다.");
			model.addAttribute("url", "/member/loginView.do");
			return "common/alert";
		} else {
			//pw 맞으면 session 보관	
			if (loginDto.getId() != 0) {
				HttpSession session = request.getSession();
				//세션에다가 인터페이스 SessionConst 상수에 넣어서 불러오기 한다.
				session.setAttribute(SessionConst.LOGIN_MEMBER, loginDto);
				//일정시간동안 서버에 응답을 보내지 않으면 해당 세션을 소명시킨다.
				//session.setMaxInactiveInterval(1000); properties에다가 1800이라고 설정했다.
				session.getAttributeNames().asIterator().forEachRemaining(
						name -> LOGGER.info("session name = {}, value = {}", name, session.getAttribute(name)));

				LOGGER.info("sessionId = {}", session.getId());
				LOGGER.info("getMaxInactiveInterval = {}", session.getMaxInactiveInterval());
				LOGGER.info("creationTime = {}", new Date(session.getCreationTime()));
				LOGGER.info("lastAccessedTime = {}", new Date(session.getLastAccessedTime()));
				LOGGER.info("isNew = {}", session.isNew());
				model.addAttribute("MemberDTO",loginDto);
				return "member/myInfo";
			} else {
				model.addAttribute("msg", "회원정보가 없습니다.");
				model.addAttribute("url", "/member/myInfoView.do");
				return "common/alert";
			}
		}

	}

HttpSession session = request.getSession();

session.setAttribute(SessionConst.LOGIN_MEMBER, loginDto);

요렇게 하면 sesstion넣는것은 끝...

보낸주는것은 model 객체로 하는것.......controller에서 계속 해야한다.

  

5. session을 단독으로 구현해봤음.....다른거랑 같이하니깐 은근 여러가지 고려해야해서...

/* session관련  */
	@GetMapping(value = "/member/session")
	public String sessionStudy(
    		@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) MemberDTO loginDto
            , HttpServletRequest request
            , HttpSession session
            , Model model) {

		/* HttpSession session = request.getSession(false); */

		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("MemberDTO", loginDto);
		LOGGER.info("@조정해봄 {} ", loginDto);
		LOGGER.info("@세션 정보만 {} ", session.getAttribute("nickName"));
		LOGGER.info("@request {} ", request.getSession());
		LOGGER.info("@SessionAttribute {} ", map);
		LOGGER.info("SessionConst.LOGIN_MEMBER",(MemberDTO)session.getAttribute(SessionConst.LOGIN_MEMBER));
		
		model.addAttribute("MemberDTO", loginDto);
		model.addAttribute("map", map);
		return "member/sessionStudy";
	}

@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) MemberDTO loginDto

한줄이면 session정보 불러오는것 끝!!!!!

콘솔에서 나오는 내용 포함

 

6. JSP기재사항 정리....은근히 나오는데 별로 없었다...검색력 부족.......

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ page session ="true"%>
<%@ page import = "java.util.Date"%>
<%@ page import = "java.text.SimpleDateFormat"%>
<%
Date time = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
					<h3>세션에 설정된 모든 값을 읽어오기</h3>

        세션 ID: <%= session.getId()%><br>
        <% time.setTime(session.getCreationTime());  %>
        세션생성시간: <%=formatter.format(time) %><br>
        <% time.setTime(session.getLastAccessedTime()); %>
        최근접근시간: <%=formatter.format(time) %>
		
	다른방법....	<br>
<%-- 	//에러발상으로 일단 지움...Enumeration 확인요망	
<%
      application.setAttribute("age", 30); 
      Enumeration<String> attrNames = application.getAttributeNames();                
      while(attrNames.hasMoreElements()){
            String attrName = attrNames.nextElement();
            Object attrValue = application.getAttribute(attrName);
            System.out.println(attrName + " : " + attrValue);
      }
%> --%>
<!-- hasMoreElements() 메서드는 Enumeration 의 메서드로 
현재 커서가 가리키는 다음 위치에도 요소가 있으면 true를 반환합니다. 
nextElement()는 커서를 다음 요소를 가리키도록 변경하고 해당 위치의 요소를 반환합니다. 
얻어온 요소(여기서는 속성명) 을 가지고 getAttribute() 메서드를 통해 속성값을 가져옵니다. -->
		
		
		
		<!-- map으로 정보 확인 -->
		건너 받은 map 정보 : ${map }<br>
		건너 받은 nickName만 : <c:out value="${map.MemberDTO['nickName'] }"/><br>
		<c:forEach var="MemberDTO" items="${map.MamberDTO }">
			${MemberDTO.id }<br>
			${MemberDTO.nickName }<br>
			${MemberDTO.email}<br>
		</c:forEach>
		<!-- session으로 정보 확인 -->
		
		건너 받은 MemberDTO : ${MemberDTO }<br>
		건너 받은 nickName만  : ${MemberDTO.nickName }<br>

출력 결과

sesstion의 정보를 jsp파일에서 어떻게 활용해야할지 일단 그냥 전달하는 것과 map 같이 전달할것 포함해서 넣었다.

리스트 같은거랑 같이 보낼수도 있으니깐....

 

sesstion정보는 많은데 이걸 내가 소화 하는 건 너무나도 어렵다...ㅠㅠ

 

+ Recent posts