728x90
300x250

[JSP] 14. Jsp/Servlet(MVC) - Session(세션) 프로젝트(로그인)


Session(세션) 방식으로 로그인 페이지를 처리하는 방법에 대해서 소개하려고 한다.

시중 책보다도 훨씬 쉽고 빠르게 적용할 수 있는 수준으로 작성하기 위해서 노력을 많이 하였으니 참고해주었으면 좋겠다.


적용된 패턴: MVC2 - FrontController, Command 패턴



* Session(세선)이란?



그림 가-1) 세션 객체와 세션 ID


HTTP 기반으로 동작하는 클라이언트가 서버에 정보를 요청할 때 생성되는 "상태정보"를 세션이라고 한다.

세션은 HttpSession이라는 인터페이스 객체로 표현되며, HttpSession 객체는 HttpServletRequest의 getSession()이나 getSession(true) 메소드를 이용하여 생성할 수 있다.


- 활용 예: 로그인, 로그아웃, 장바구니 기능 등 사용자 인증 처리에 사용함.



* HttpSession 메소드


접근자&반환형

메소드

기능

public Object

getAttribute(String name)

HttpSession 객체에 등록된 정보 중 getAttribute() 메소드의 인자값으로

지정된 데이터 값을 반환한다.

public Enumeration

getAttributeNames()

HttpSession 객체에 등록되어 있는 모든 정보의 이름만을 반환한다.

public String

getId()

HttpSession 객체의 지정된 세션 ID를 반환함.

public long

getCreationTime()

HttpSession 객체가 생성된 시간을 밀리초 단위로 반환함.

public long

getLastAccessedTime()

클라이언트 요청이 마지막으로 시도된 시간을 밀리초 단위로 반환됨.

public int

getMaxInactiveInterval()

클라이언트의 요청이 없을 때 서버가 현재의 세션을 언제까지 

유지할지를 초 단위로 반환한다.

기본 유효 시간은 30분으로 지정되어 있다.

public void

invalidate()

현재의 세션을 삭제한다.

public boolean

isNew()

서버 측에서 새로운 HttpSession 객체를 생성한 경우에는 true를 반환,

기존 세션이 유지되는 경우라면 false를 반환

public void

setAttribute(String name, Object value) 

HttpSession 객체에 name으로 지정된 이름으로 value값을 등록한다.

public void

removeAttributes(String name)

HttpSession 객체에서 name으로 지정된 객체를 삭제한다.

public void

setMaxInactiveInterval(int second)

HttpSession 객체의 유지 시간을 설정한다.

지정된 시간이 지나면 HttpSession 객체는 자동 삭제된다.




1. 결과


Session 기반의 로그인 페이지를 아래처럼 만들어보려고 한다.

그림 1. 프로젝트 결과 - 로그인 페이지


그림 2. 프로젝트 결과 - 오류 출력




그림 3. 로그인 상태



그림 4. 자바스크립트 - 알람 메시지 출력



2. 프로젝트 구성도


다음은 작업할 프로젝트에 관한 것이다. 양이 조금 많아서 2~3부 정도로 컨텐츠를 구성하였다.



그림 5. 프로젝트 구성도



3. Maven Project 생성하기


새 프로젝트를 만든다.



그림 6. New-> Maven 프로젝트


Maven 폴더의 "Maven Project"를 선택한다.

"Next"를 누른다.




그림 7. New-> Maven 프로젝트


org.apache.maven.archetypes  |   maven-archetype-webapp를 선택한다.

Next를 누른다.




그림 8. New-> Maven 프로젝트


Group ID와 Artifact ID를 입력한 후 Finish를 누른다.



4. Project Facts, Build Path 설정하기


의외로 프로젝트 속성을 못 찾는 경우가 있어서 그림으로 매우 친절하게 작성하였다.



그림 9. 프로젝트 - 마우스 오른쪽 버튼 모습


프로젝트를 마우스 오른쪽 버튼을 누른다.

Properties를 클릭한다.



그림 10. Build Path 설정 모습


JRE System Library [JavaSE-14] 버전으로 변경해준다.

(Edit 버튼을 눌러서 JRE 클릭 후 변경해주면 됨.)

Apply를 누른다.




그림 11. Project Factes


Project Facet의 Java 항목에 Version을 14로 변경해준다.

Apply를 누른다.



5. pom.xml 설정하기


http://mvnrepository.com에 접속한다.



그림 12. Java Servlet API - 4.0.1 - Mvnrepository.com


servlet을 찾아서 Maven 정보를 복사한다.



그림 13. pom.xml 설정하기


    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>4.0.1</version>

    <scope>provided</scope>

</dependency>



6. Servlet - FrontController 생성하기


서블릿 생성을 한다.



그림 14. 프로젝트의 "Java Resources" 메뉴


Java Resources를 오른쪽 버튼을 클릭한다.

New->Servlet을 클릭한다.



그림 15. Create Servlet


패키지명(Java Package)은 "com.member.web.controller"로 지정하였다.

클래스명(Class Name)은 "FrontController"를 입력하였다.


Next를 누른다.


(중략)




그림 16. web.xml (src/main/webapp/WEB-INF/web.xml)


web.xml 파일을 수정해준다.


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns="http://java.sun.com/xml/ns/javaee" 

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 

id="WebApp_ID" version="3.0">


  <display-name>Archetype Created Web Application</display-name>

  

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.do</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.do</welcome-file>

  </welcome-file-list>

  

  <servlet>

  <servlet-name>FrontController</servlet-name>

  <servlet-class>com.member.web.controller.FrontController</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet-mapping>

  <servlet-name>FrontController</servlet-name>

  <url-pattern>*.do</url-pattern>

  </servlet-mapping>

</web-app>


파일명: web.xml


[첨부(Attachments)]

web.zip



7. Controller - HttpUtil.java


forward 함수에 관한 것이다.


package com.member.web.controller;


import java.io.IOException;


import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class HttpUtil extends HttpServlet {


private static final long serialVersionUID = 1L;

private static String charset = null;


public static void forward(HttpServletRequest req, HttpServletResponse res,

String path) throws ServletException, IOException {

try {


RequestDispatcher dispatcher = req.getRequestDispatcher(path);

dispatcher.forward(req, res);


}catch(Exception e) {

e.printStackTrace();

}

}

}


파일명: HttpUtil.java


[첨부(Attachments)]

HttpUtil.zip



8. Controller(Interface) - Controller.java


Interface Controller를 하나 설계하였다.


package com.member.web.controller;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public interface Controller {


public void execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException;


}


파일명: Controller.java


[첨부(Attachments)]

Controller.zip




9. Controller - FrontController.java


FrontController, Command 패턴에 관한 것이다.


package com.member.web.controller;


import java.io.IOException;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class FrontController extends HttpServlet {

private static final long serialVersionUID = 1L;

private String charset = null;

       

    public FrontController() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doAction(req, res);

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doGet(req, res);

}

protected void doAction(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

ServletConfig sc = this.getServletConfig();

charset = sc.getInitParameter("charset");


req.setAttribute("charset", charset);

req.setCharacterEncoding(charset);

res.setContentType("text/html; charset=" + charset);


String uri = req.getRequestURI();

String conPath = req.getContextPath();

String command = uri.substring(conPath.length());

Controller subController = null;


if(command.equals("/member/login.do")){

System.out.println("login");

System.out.println("----------------");


subController = new MemberLoginController();

    subController.execute(req, res);


}else if (command.equals("/member/process.do")) {

System.out.println("process");

System.out.println("----------------");


subController = new MemberProcessController();

    subController.execute(req, res);

   

}else if (command.equals("/member/logon.do")) {

System.out.println("logon");

System.out.println("----------------");

subController = new MemberLogonController();

    subController.execute(req, res);

}else if (command.equals("/member/logout.do")) {

System.out.println("logout");

System.out.println("----------------");

subController = new MemberLogoutController();

    subController.execute(req, res);

   

}else if (command.equals("/member/sessionAllKill.do")) {


System.out.println("sessionAllKill");

System.out.println("----------------");

subController = new MemberSessionAllKillController();

    subController.execute(req, res);

   

}else if (command.equals("/member/errorAlert.do")) {


System.out.println("errorAlert");

System.out.println("----------------");

subController = new MemberErrorAlertController();

    subController.execute(req, res);

}

// end of if

}


}


파일명: FrontController.java


[첨부(Attachments)]

FrontController.zip


[비고]

MemberLoginController()

MemberProcessController()

MemberLogonController()

MemberLogoutController()

MemberSessionAllKillController()

MemberErrorAlertController()


번호

구현부

인터페이스

비고

1

MemberLoginController

Controller


2

MemberProcessController

Controller


3

MemberLogonController

Controller

 

4

MemberLogoutController

Controller


5

MemberSessionAllKillController

Controller

 

6

MemberErrorAlertController

Controller

 


약 6개의 Controller들은 추후 생성할 것이다.

다소 이름이 길긴 하지만, 추후 고민할 문제해봐도 되는 문제이고 진행하도록 하겠다.


실제 설계하고 코딩했을 때는 바로 저 코드가 한번에 나오지 않았다는 것이다.

단계, 단계 구간별로 필요에 의해서 하나 하나 만들어진 것이다.



* 2부에서 만나요.


2부에서는 view생성, 나머지 콘트롤러 구현에 대해서 소개하도록 하겠다.


[JSP] 14. Jsp/Servlet(MVC) - Session(세션) 프로젝트(로그인) - (2), 2020-09-25

https://yyman.tistory.com/1417


반응형

+ Recent posts