JSP

 

 

login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
  <form name="frmLogin"  method="post"  action="loginTest"  encType="utf-8">
	  아이디  :<input type="text" name="id"><br>
    비밀번호:<input type="password" name="pw"><br>
       <input type="submit" value="로그인">
       <input type="reset" value="다시입력">
  </form>
</body>
</html>

 

 

LoginVO.java

 


public class LoginVO {

	private String id;
	private String sessionid;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getSessionid() {
		return sessionid;
	}
	public void setSessionid(String sessionid) {
		this.sessionid = sessionid;
	}
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		LoginVO other = (LoginVO) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;		
		return true;
	}
	
	


	
	
}

 

 

LoginTest.java


import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/loginTest")
public class LoginTest extends HttpServlet{


	
	//전역변수
	public static List<LoginVO> userList=new ArrayList<LoginVO>(); 
	
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out=response.getWriter();
		HttpSession session=request.getSession();
				
		String id=request.getParameter("id");
		String pw=request.getParameter("pw");
		
		// 로그인 성공시		
		if(pw.equals("1111")) {
			System.out.println(" session.getId() :" + session.getId());			
			LoginImpl loginUser =new LoginImpl(id, pw, session.getId());
			LoginVO loginVO=new LoginVO();
			session.setAttribute("loginUser", loginUser);			
			
			loginVO.setId(id);
			loginVO.setSessionid(session.getId());
			userList.add(loginVO);
			
	     }else {
	           //로그인 실패시 로그인 페이지로 리다이렉트
	           response.sendRedirect("login.html");
	     }

		out.print("<html><body>");
		out.print("현재 접속 아이디 : "+id+"<br>");			

		userList(out);		//접속자 중복 제거 및 접속자 목록

		
		out.println("<a href='logout.do?id=" + id + "'>로그아웃 </a><br>");
		out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
		out.print("</body></html>");		
	}
	
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out=response.getWriter();
		HttpSession session=request.getSession();

		
		out.print("<html>");
		out.println("<head>");
		out.println("<script type='text/javascript'>");
		out.println("setTimeout('history.go(0);', 3000)"); //3초마다
		out.println("</script>");
		out.println("</head>");
		out.print("<body>");
		
		userList(out);		//접속자 중복 제거 및 접속자 목록
		
		LoginImpl loginUser =(LoginImpl)session.getAttribute("loginUser");
		
		if(loginUser==null) {
			out.println("<a href='login.html'>로그인 </a><br>");	
		}else{
			out.println("<a href='logout.do?id=" + loginUser.id + "'>로그아웃 </a><br>");	
		}

		
		
		out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
		out.print("</body></html>");	
	}
	
	
	//접속자 중복 제거 및 접속자 목록
	private void userList(PrintWriter out) {
	
		//중복 아이디 제거
		HashSet<LoginVO> hs = new HashSet<LoginVO>(userList);		
		userList = new ArrayList<LoginVO>(hs);
		
		if(userList!=null &&userList.size()>0) {
			out.println("*** 접속 자 목록 *** <br>");
									
			for(int i=0; i<userList.size(); i++) {
				if(userList.get(i)==null || userList.get(i).equals("")) {
					userList.remove(i);	
					LoginImpl.loginUserCount--;

				}else {						
					out.println(userList.get(i).getId()+"<br>");	
				}				
			}

			out.print("총 로그인 접속자수는 "+ LoginImpl.loginUserCount + "<br>");
			out.print("<a href='loginTest'>접속자 목록</a><br>");
			System.out.println("userList(PrintWriter out) userList size : " +userList.size());
		}else {
			out.print("총 로그인 접속자수는 0 <br>");
		}

	}


	
	
}



 

 

LoginImpl.java

 

@WebListener 해주면 HttpSessionListener  는 실시간으로 세션을 상태를  created ,  destroyed 반영해 준다.


import java.util.List;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class LoginImpl  implements HttpSessionListener  {

	String id;
	String pw;
	String sessionid;
	static int loginUserCount=0;
		
	
	public LoginImpl() {
	
	}
	
	public LoginImpl(String id, String pw, String sessionid) {
		this.id=id;
		this.pw=pw;	
		this.sessionid=sessionid;
	}
	
	
	
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("세션 생성");
		++loginUserCount;
		
		System.out.printf("생성된 SESSIONID %s \n",  se.getSession().getId());
        System.out.printf("로그인된 사용자 수 : %d \n", loginUserCount);
	}
	
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("세션 소멸");		
		System.out.printf("세션 소멸된 아이디 SESSIONID %s \n",  se.getSession().getId());
		
		List<LoginVO> userList=LoginTest.userList;
		
		//접소자 목록에서 제거
		if(userList!=null && userList.size()>0) {
			for(int i=0; i<userList.size(); i++) {
				if(userList.get(i)!=null || userList.get(i).getSessionid().equals(se.getSession().getId())){
					userList.remove(i);	
					LoginImpl.loginUserCount--;				
				}			
			}
		}
		
        System.out.printf("로그인된 사용자 수 : %d \n", loginUserCount);
	}

	
	
	
	
	
}

 

 

LogOutServlet.java


import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/logout.do")
public class LogOutServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {						
		String id = request.getParameter("id");
		
		if(id!=null){
			
			List<LoginVO> userList=LoginTest.userList;
			if(userList!=null && userList.size()>0) {					
				System.out.println("id 제거 : " + id);
				for(int i=0; i<userList.size(); i++) {
					System.out.println("userList.get(i) : " +userList.get(i));
					if(userList.get(i).equals(id)) {
						userList.remove(i);
					}
				}
			}
			System.out.println("userList size : " +userList.size());
		}		
		request.getSession().invalidate();
		response.sendRedirect("login.html");
	}
	
	
}

 

 

web.xml

테스트를 위해 세션유지시간을 1분으로 설정한다.

	<session-config>
		<session-timeout>1</session-timeout>
	</session-config>

 

 

about author

PHRASE

Level 60  라이트

월(越) 나라 사람은 월 나라에 안주하고 초(楚) 나라 사람은 초 나라에 안주하며 군자는 문아(文雅)한 생활에 안주한다. 제각기 편안하게 살 곳이 있다는 말. -순자

댓글 ( 4)

댓글 남기기

작성