본문 바로가기

카테고리 없음

[JAVA 웹 개발 공부] 국비지원 60일차 - Session, JSP 기본객체, web.xml, 서블릿 매핑

Session

 

1. 세션

웹 브라우저에 정보를 보관할 때  쿠키를 사용한다면, 세션은 웹 컨테이너에 정보를 보관할 때 사용한다. 세션은 오직 서버에만 생성된다.

웹 컨테이너는 기본적으로 한 웹 브라우저마다 한 세션을 생성한다. 웹 브라우저마다 세션이 따로 존재하기 때문에, 세션은 웹 브라우저와 관련된 정보를 저장하기에 알맞은 장소이다. 즉, 쿠키가 클라이언트 측의 데이터 보관소라면 세션은 서버측의 보관소인 것이다.

쿠키와 마찬가지로 세션도 생성을 해야만 정보를 저장할 수 있다. 

 

 

2. 세션 생성하기

<%@ page session="true" %>

session 속성은 기본값이 true이므로 session 속성값을 false로 지정하지만 않으면 세션이 생성된다. 

세션이 생성되면 session 기본 객체를 통해서 세션을 사용할 수 있다.

세션을 사용하는 서버 프로그램에 웹 브라우저가 처음 접속할 때 세션을 생성하고, 그 이후로는 이미 생성된 세션을 사용한다.

 

 

3. 세션에 값 저장하기

session.setAttribute(이름, 값);

setAttribute 메소드는 이름, 값 쌍으로 세션에 정보를 저장할 수 있다.

 

 

4. 세션에서 값 가져오기

session.getAttribute(name);

getAttribute 메소드는 세션에 저장된 값을 이름으로 조회해 값을 반환받는다.
값은 반환받을 때 Object 타입으로 돌아오기 때문에 사용하실 때 형변환이 필요하다.

 

*session 기본 객체가 제공하는 세션 정보 관련 메소드

메소드 리턴 타입 설명
getId() String 세션의 고유한 ID를 구한다. (세션 ID라고 한다.)
getCreationTime() long 세션이 생성된 시간을 구한다. 시간은 1970년 1월 1일 이후 흘러간 시간을 의미하며, 단위는 1/1000초이다.
getLastAccessedTime() long 웹 브라우저가 가장 마지막에 세션에 접근한 시간을 구한다. 시간은 1970년 1월 1일 이후 흘러간 시간을 의미하며, 단위는 1/1000초이다.

+) 세션 ID

웹 브라우저마다 별도의 세션을 갖는데, 각 세션을 구분하기 위해서 세션마다 고유 ID를 할당하며 그 아이디를 세션 ID라고 한다.

웹 브라우저는 웹 서버에 연결할 때마다 매변 세션 ID를 보내서 웹 서버가 어떤 세션을 사용할지 판단할 수 있게 한다. JSESSIONID 쿠키가 세션 ID를 공유할 때 사용하는 쿠키이다.

 

 

5. 세션에서 이름 가져오기

Enumeration attr = session.getAttributeNames();

while(attr.hasMoreElements())	{
	String attrName = (String)attr.nextElement();
	String attrValue = (String)session.getAttribute(attrName);
	out.println("세션의 속성명은" + attrName + " 이고 ");
	out.println("세션의 속성값은" + attrValue + "이다.");
}

세션에 어떤 값이 저장되어 있는지 확인할 때는 getAttributeName() 메소드를 사용해 문자열로 반환받은 name들을 Enumeration으로 가공한다.
Enumeration은 일종의 반복자로 컬렉션에서의 iterator와 동일한 역할을 수행한다.
hasMoreElements()는 다음 값이 존재하면 true, 존재하지 않으면 false를 반환하고,
nextElement()를 이용해 다음 값을 순차적으로 꺼내 리턴한다.

 


6. 세션 정보 삭제하기

// 특정 세션 값 삭제
session.removeAttribute(name)

// 모든 세션 값 삭제
session.invalidate()

 

 

JSP 기본 객체

 

 

1. page(pageContext)
하나의 JSP페이지
페이지는 하나의 JSP이므로, 한 페이지에서 다른 페이지의 정보를 사용할 수 없다.

2. request
하나의 http요청 정보
클라이언트로부터 오는 한번의 요청과 관련된 영역으로, 브라우저가 결과를 받으면 요청했던 request객체는 사라짐.
하나의 요청 처리하는데 모든 JSP를 포함한다.

3. session
하나의 브라우저
세션은 하나의 브라우저(Chrome, Internet, Microsoft Edge 등) 내에서만 정보/값 공유한다.
주로 로그인 정보/상태를 유지할때 사용함.

4. application
하나의 웹 애플리케이션
애플리케이션은 모든 유저, 모든 페이지, 페이지 요청, 세션에 공유될 수 있음.

 

 

web.xml

 

1. web.xml

Web Application의 Deployment Descriptor(환경파일 : 배포서술자, DD파일)로서 XML 형식의 파일이며,
모든 웹 어플리케이션은 반드시 하나의 web.xml파일을 가져야 한다.

웹 어플리케이션 설정을 태그를 통해서 할 수 있게 만들어진 파일이다.
web.xml 파일의 설정들은 웹 어플리케이션 시작시 메모리에 로딩된다.

 

 

2. web.xml 생성

프로젝트 우클릭 > Java EE Tools > Generate Deployment Descriptor Stub > WEB-INF 폴더에 web.xml 파일 생성

 

 

3. 서블릿 등록

<servlet> : 서블릿 객체 설정
   <servlet-name>객체의 이름</servlet-name>
   <servlet-class>객체를 생성할 클래스</servlet-class>
</servlet>

*servlet-name : 아래 servlet-mapping에 기술주기 위한 식별자
*servlet-class : 실제 서블릿 클래스, 패키지까지 정확하게 기술

 

 

4. 서블릿 매핑

<servlet-mapping>
   <servlet-name>동작할 서블릿 객체의 이름</servlet-name>
   <url-pattern>클라이언트가 요청할 url 패턴</url-pattern>
</servlet-mapping>

*servlet-name : 위에 servlet에 명시한 이름
*url-pattern : 어떠한 URL경로로 접근할 수 있는지를 명시

 

+) 서블릿 매핑하는 이유

작성한 servlet에 접근을 하기 위해 해당 servlet에 패키지명부터 클래스명까지 모두 입력해주어야 한다.
이렇게 된다면 보안상의 문제(디렉토리 구조 노출)와 접근의 불편함(클래스명을 다 입력해주어야 함)이 있다.
이때 개발자가 간단한 URL을 접목시켜 위의 불편사항들을 해결할 수 있다. 

 

 

5. web.xml 예제

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  <display-name>web04</display-name>
  <welcome-file-list>
    <welcome-file>welcom.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>HelloServlet</servlet-name>
  	<servlet-class>web04.HelloServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>HelloServlet</servlet-name>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

 

 

JSP 연습 - 세션 활용하기

 

*index.html

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
	<a href="login.jsp">로그인 하러 가기</a><br/>
	<a href="logincheck.jsp">로그인 상태 확인하기</a><br/>
	<a href="logout.jsp">로그아웃</a>
</body>
</html>

 

*login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 폼</title>
</head>
<body>
	<form action="loginprogress.jsp" method="post">
		<input type="text" name="id" required/>
		<input type="password" name="password" required/>
		<input type="submit"/>
	</form>
</body>
</html>

 

*loginprogress.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	if (id.length() > 0 && password.equals("admin")) {
		session.setAttribute("login", id);
	}
	
	response.sendRedirect("./index.jsp");
%>

 

*logincheck.jsp

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 값 확인</title>
</head>
<body>
	<%= session.getAttribute("login") %>
	<%
		Date d1 = new Date(session.getCreationTime());
		Date d2 = new Date(session.getLastAccessedTime());
	%>
	<br/>
	<p>세션 아이디 <%= session.getId() %></p>
	<p>세션 생성시간 <%= d1 %></p>
	<p>세션 마지막 접근 시간 <%= d2 %></p>
</body>
</html>

 

*logout.jsp

<%
	session.invalidate();
	response.sendRedirect("./index.jsp");
%>