Session 을이용한현재로그인한사용자의 숫자구하기 작성자 : 김성박 ( 삼성 SDS 멀티캠퍼스전임강사 ) email : urstory@nownuri.net homepage : http://sunny.sarang.net - 본문서는http://sunny.sarang.net JAVA강좌란 혹은 http://www.javastudy.co.kr 의 칼럼 란에서만배포합니다. 문서는계속버전업될수있습니다. 필자의허락없이수정, 삭제, 재작성, 이동등을할수없습니다. - 잘못된부분을발견하거나, 추가할사항이있다면작성자에게메일보내주신다면감사하겠습니다. - 해당문서는 Java기본, jsp에대한기본지식이필요합니다. - 해당문서는 windows 2000환경, tomcat 3.x 에서 test 되었습니다. jsp 프로그래밍을하다보면현재로그인한사용자가몇명인지알고싶은경우가있습니 다. 혹은현재접속한사용자가몇명인지궁금할경우도있습니다. 이러한정보는 Session 을이용하여구할수가있습니다. 1. javax.servlet.http.httpsessionbindinglistener HttpSessionBindingLister 는세션이서버에서사라질때와세션이서버에서생성될때어 떤특별한작업을처리하고자할경우사용되는 interface 입니다. HttpSessionBindingLister를구현해준객체는 Session에값이지정될때와값이해제될때에특별한처리를할수있습니다. 이렇게세션에값이지정될때와해제될때의특별한처리를하기위하여는 HttpSessionBindingListener가가지고있는 2개의메소드를구현해줘야합니다. 각각의메서드는아래와같습니다. public void valuebound(httpsessionbindingevent event) valuebound 메서드는값이지정될때특별한처리를하는메서드입니다. public void valueunbound(httpsessionbindingevent event) 1
valueunbound 메서드는값이해제될때특별한처리를하는메서드입니다. 2. javax.servlet.http.httpsessionbindingevent HttpSessionBindingEvent class 는 HttpSessionEvent 를상속받으며현재웹어플리케이션 의 Session 객체를참조할수있도록하여주는 getsession() 메서드를가지고있습니다. 3. 싱글턴패턴의이용 : 접속한사용자의수를세기위하여는딱하나의객체가필요하다. 접속한사용자의숫자를관리해주는객체는딱하나가존재하여야합니다. 만약숫자를관리해주는객체가여러가지라면, 해당숫자를제대로관리해주지못할것입니다. 이렇게객체를메모리상에하나만유지시키면서관리해주고싶을경우에사용하는프로그래밍방법으로싱글톤패턴이란것이있습니다. 싱글톤패턴의한가지예로아래의소스를보도록합시다. public class UserList{ private static UserList userlist = null; private UserList() { public static UserList getinstance() { if (userlist == null) { userlist = new UserList(); return userlist; 위에서중요하게봐야할부분은진하게표시된부분입니다. 먼저맴버변수로자기자신즉 UserList를가리킬수있는 UserList의인스턴스변수 userlist가 private으로선언되어있음을알수있습니다. 여기까지는별로어려운부분이아니지만다음줄에있는생성자를보면생성자앞에 private 접근지정자가붙어있는것을볼수있습니다. private 접근지정자는같은 class에서만접근을허용하기위한것인데, 생성자앞에 private이붙어있다는것은어떤객체도 UserList의생성자를호출할수없다는이야기입니다. 즉, 상당히웃긴모양이되는것인데요 class를만들긴만들었지만, 사용할수없다는것입니다. 하지만 2
바로아래에있는 getinstance라는메서드를보면해결책을발견할수있습니다. getinstance 메서드를보면자기자신을객체로서리턴하는것을알수있습니다. 또한 getinstance 메서드는 static함메서드로객체를생성하지않고도직접이용할수있습니다. 즉 UserList 클래스에대한객체를생성하기위하여는생성자를직접호출하지못하고 getinstance메서드를호출해야만가능하다는것입니다. getinstance메서드의구현된내용을보면 userlist가널일경우에는자기자신의생성자를호출하여객체를리턴하고, 널이아닐경우에는현재맴버변수의값을리턴하는것을알수있습니다. 이때맴버변수의형식이중요한데맴버변수는 static한변수라는것입니다. 이 static 한변수는쓰레드상에서공유가되는변수값이라는것을알것입니다. 맴버변수 userlist는 static 변수이기때문에공유가됩니다. 즉, 생성자를호출할수없기때문에새로운객체가생성되지않고 getinstance메소드를통하여만 UserList의객체를구할수있는데이객체는딱하나의인스턴스로공유가된다는것이지요. 이렇게하나의객체만을이용하는방법을싱글턴패턴이라고합니다. 4. 실제 Class 의구현 HttpSessionBindingListener 를구현하고, 싱글턴패턴을적용하여 UserList class 를생성합 니다. 해당 class 를 jsp 에서인식할수있는 classpath 에서 d 옵션을주어컴파일합니다. javac d. UserList.java UserList.java 시작 -------------------------------------------------- package userlist; import javax.servlet.http.*; import java.util.*; // HttpSessionBindingLister를구현 public class UserList implements HttpSessionBindingListener { // 싱글턴패턴 private static UserList userlist = null; private Set users = new HashSet(); private UserList() { super(); 3
public static UserList getinstance() { if (userlist == null) { userlist = new UserList(); return userlist; // 값이지정될경우의처리 public void valuebound(httpsessionbindingevent sbe) { // 현재 session정보로부터 user에해당되는값을얻어와 // HashSet에저장 users.add(sbe.getsession().getattribute("user")); //Add the session session // 값이해제될경우의처리 public void valueunbound(httpsessionbindingevent sbe) { // 현재 session정보로부터 user에해당하는값을얻어와 // HashSet에서삭제 users.remove(sbe.getsession().getattribute("user"));//remove the // 실제로그인한사람의숫자를새는부분으로 HashSet의전체수를리턴 public synchronized int getusercount() { return users.size(); //Returns the no of live user sessions UserList.java 끝 ---------------------------------------------------- 5. jsp 에서의이용 전체로그인한사람의숫자를출력하는 usrlist.jsp 를작성합니다. userlist.jsp 를그냥실행 하였을경우에는 guest 사용자가로그인한것으로보며, get 방식이나 post 방식으로 id 값을 지정해줄경우에는해당 id 로로그인한것으로가정합니다. 만약 login form 등을통하여 4
id 와 password 를전달받는다면해당 id 와 password 에일치하는사람이있는지확인하고 있을경우에 session 에아래와같은소스처럼사용자를등록해주면될것입니다. userlist.jsp 시작 ---------------------------------------------------- <%@ page contenttype="text/html;charset=euc-kr"%> <% // 외부로부터 id 값을전달받는다. 만약에전달된값이없을경우 // guest 유저로생각한다. String user_name = request.getparameter("id"); if(user_name == null){ user_name = "guest"; // 전달받은사용자 id를세션에 user란이름으로등록한다. session.setattribute("user",user_name); // UserList객체의 getinstance메서드를호출하여 UserList객체를할당받는다. // 할당받은객체를 userlist라는이름으로세션에등록한다. // UserList객체는싱글턴패턴을적용하였기때문에다른 jsp에서도하나의객체로 // 공유하게된다. session.setattribute("userlist",userlist.userlist.getinstance()); // 세션에저장되어있는 UserList객체를반환받는다. userlist.userlist ul = (userlist.userlist)session.getattribute("userlist"); // 세션에등록된로그인한사용자의수를반환하여출력한다. out.println(" 접속사용자수 : " + ul.getusercount()); %> userlist.jsp 끝 ----------------------------------------------------- 5
그림 1 guest user 로접속하였을경우 그림 2 id 가 carami 인사용자로접속하였을경우 6. 마치며 이상으로 session을이용하여현재접속중인사용자에대한처리를하는것을보았습니다. 그렇다면현재홈페이지를이용하는모든사용자가몇명인지는어떻게구할수있을까요? 그것은여러분에게맡기도록하겠습니다. 답을구하신분이있으시다면 http://sunny.sarang.net Servlet/JSP tip 게시판에올려주신다면감사하겠습니다. 6