ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 로그인아웃, session
    JAVA 2021. 7. 26. 12:46

    로그인

    앞으로 jsp 의 <%@ %>: 디렉티브태그에 session="false" 를 넣자.

    이 의미는 내가 만들기 전까지 session이 자동으로 만들어지는걸 방지하는 것이다.

    >> 로그인준비.java

    public class 로그인준비 implements IControl{
    
    	public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
    		
    		ModelAndView mv = new ModelAndView();
    		
    		mv.addObject("key", "value");
    		mv.setViewName("로그인창");
    		
    		return mv;
    	}
    
    }

    >> 로그인창.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>로그인</h1>
    <p>${msg}</p>
    <form action="login.do" method="post" onsubmit="return 필수입력()">
    id <input type="text" id="id" name="id"/>
    password <input type="password" id="password" name="password"/>
    <input type="submit" value="로그인"/>
    </form>
    </body>
    </html>
    <script>
    	function 필수입력(){
    		var id = document.querySelector("#id").value;
    		var password = document.querySelector("#password").value;
    		
    		if(id==null || id==""){
    			alert("아이디를 입력하세요");
    			return false;
    		}
    		if(password==null || password==""){
    			alert("비밀번호를 입력하세요");
    			return false;
    		}
    		
    		return true;
    	}
    </script>

    >> 로그인.java (MemberDAO 의 isin() 메서드 수정함// 밑에서 확인)

    public class 로그인 implements IControl{
    
    	public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
    		//요청
    		String id = request.getParameter("id");
    		String password = request.getParameter("password");
    		MemberDAO dao = new MemberDAO();
    		
    		Object[] NoAndName = dao.isin(id, password);
    		
    		ModelAndView mv = new ModelAndView();
    		if(NoAndName==null) {
    			//여기서 조건을 따져 forward 로 보내며 msg 까지 설정하면 로그인준비 control 에서 다시 조건을 따져 request 로 값을 받고 view 넘기지 않아도
    			//이 값들이 request에 누적되어 view까지 넘어간다.
    			mv.addObject("msg", "id 또는 비밀번호가 일치하지 않습니다.");
    			mv.setViewName("forward:/prepare_login.do");
    			return mv;
    		}
    		
    		// 로그인할 때만 session 을 만들고 로그인했으니 회원번호를 session에 저장하여 앞으로 나올 페이지들을 회원껄로 바꿔야한다.
    		HttpSession session = request.getSession();
    		session.setAttribute("no", NoAndName[0]);	// 회원 번호 저장.
    		session.setAttribute("name", NoAndName[1]);	// 회원 번호 저장.
    		session.setMaxInactiveInterval(60*30); 	// s(초) 단위. session이 존재하는 시간. 즉, 로그인 유지시간이다. web.xml 에서도 지정가능하며 거기는 분단위다.
    		mv.setViewName("로그인성공");//아직없는창
    		
    		return mv;
    	}
    
    }

    >> MemberDAO.java ( name 만 나왔는데 이제 no, name 두개를 Object[] 에 담아서 나온다.)

    	public Object[] isin(String id, String password) {
    		
    		Object[] NoAndName = null;
    		
    		try {
    			Connection c = ConnectionUtil.getConnection();
    			PreparedStatement pre = c.prepareStatement("select no,name from member where id = ? and password = ?");
    			pre.setString(1, id);
    			pre.setString(2, password);
    			ResultSet set = pre.executeQuery();
    			
    			if(set.next()) {
    				int no = set.getInt("no");
    				String name = set.getNString("name");
    				NoAndName = new Object[2];
    				NoAndName[0] = no;
    				NoAndName[1] = name;
    			}
    			
    			set.close();
    			pre.close();
    			c.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return NoAndName;
    	}

    >> 로그인성공.jsp

    <body>
    ${name} 님 환영합니다.
    <a href="contents.do">내용</a>
    </body>

    >> 내용보이기.java

    public class 내용보이기 implements IControl {
    
    	@Override
    	public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
    		ModelAndView mv = new ModelAndView();
    		mv.setViewName("내용창");
    		return mv;
    	}

    >> 내용창.jsp

    <body>
    <jsp:include page="로그인상단.jsp"/>
    <p>
    Acknowledgements
    To the Student
    To the Teacher
    </body>

    >> 로그인상단.jsp

    상단에서 먼저 session 이 null 이 아니지만 다른 값이고 로그인시 name 이 저장되어야 하는데 null인 경우 session을 null로 바꾼다.

    그리고 하단에서 로그인여부(session존재여부) 를 따져 나올 내용을 정한다.

    <%
       HttpSession session= request.getSession(false);
       if(session!=null&& session.getAttribute("name")==null){session=null;}
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <style>
    
    </style>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    <% if(session!=null){  %>
      <%=(String)session.getAttribute("name") %><img src="img/logined.png"/><button onclick="location.href='logout.do'">로그아웃</button>
    <%}else{ %>
       <button onclick="location.href='prepare_login.do'">로그인</button>
    <%} %>
    </body>

    로그아웃

    >> 로그아웃.java

    	@Override
    	public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
    		
    		HttpSession session = request.getSession(false);
    		if(session != null) {
    			session.invalidate();
    		}
    		
    		ModelAndView mv = new ModelAndView();
    		
    		mv.setViewName("forward:/contents.do");
    		return mv;
    	}

    Session

    : 로그인, 로그아웃 시 필요

    HttpSession session= request.getSession(false);
    if(session!=null&& session.getAttribute("name")==null){session=null;}
    session을 통해 로그인 여부 확인하기
    (로그인시 session을 생성하고 또는 이미존재하는걸 가져오고, 회원의 이름을 저장해놓은 상태다)
    1. getSession(false) : session 이 없다면 null 로 설정하고 한다.
    session에 값이 있는지 확인하기위해 가져오기는 해야하니 getSession(false) 로 가져와 없으면 메서드의 매개변수(false)를 사용해
    null 로 만든다.
    (if문을 수행하지 않아도 null이다.)
    2. 만약 존재한다면 그 session 에 회원이 로그인 했을 시 있을 회원이름이 존재하는지 확인한다.
    만약 없고 null 이라면 session 을 null 로 바꿔 앞으로 로그인 여부확인 시 로그아웃상태임을 알린다.
    session.invalidate() 
    // session 값들 초기화
    로그아웃 시 session 을 없애기
    invalidate() 라는 메서드로 session 을 없앤다.

    댓글

Designed by Tistory.