Servlet

encodeURL()

dev23 2024. 8. 13. 15:58
반응형

- 세션도 클라이언트의 세션 쿠키를 이용해 브라우저에 대한 세션 기능을 한다. 그런데 만약 브라우저에서 쿠키 기능을 사용할 없게 설정했다면 쿠키 기능은 물론 세션 기능도 사용할 없다.

- 이럴 때는 encodeURL() 메서드를 이용해 직접 서버에서 브라우저로 응답을 먼저 보낸 URL Rewriting 이용해
jsessionId 서버로 전송하여 세션 기능을 사용하면 된다.

 

브라우저에서 쿠키 사용 금지 설정

 

- 크롬의 경우 브라우저 [설정] 페이지에서 [개인 정보 보호 및 보안] - [서드 파티 쿠키] 페이지를 보면 "서드 파티 쿠키 차단" 옵션이 존재한다. 쿠키를 차단하는 경우 해당 옵션을 선택한다.

쿠키 차단

 

쿠키 사용이 중지된 경우의 세션 사용

- 세션 쿠키를 사용하지 않고 encodeURL() 메서드를 이용해 jsessionId 세션 id 브라우저에 응답으로 전송한  
세션을 사용해본다.

 

- encodeURL에 대한 설명은 다음에서 찾을 수 있다.

https://tomcat.apache.org/tomcat-9.0-doc/servletapi/javax/servlet/http/HttpServletResponse.html#encodeURL(java.lang.String)

 

HttpServletResponse (Servlet 4.0 API Documentation - Apache Tomcat 9.0.93)

All Superinterfaces: ServletResponse All Known Implementing Classes: HttpServletResponseWrapper Extends the ServletResponse interface to provide HTTP-specific functionality in sending a response. For example, it has methods to access HTTP headers and cooki

tomcat.apache.org

 

 

더보기

Encodes the specified URL by including the session ID in it, or, if encoding is not needed, returns the URL unchanged.

세션 ID를 포함하여 URL을 인코딩한다. 인코딩이 필요하지 않은 경우 URL을 변경하지 않고 반환한다.

 

* login.html

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

 

* SessionTest.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

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;

/**
 * Servlet implementation class SessionTest
 */
@WebServlet("/login")
public class SessionTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	
	public void doHandle(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 user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		
		if(session.isNew()) {
			if(user_id != null && user_id.length() != 0) {
				session.setAttribute("user_id", user_id);
				
				// 변수 url에 encodeURL()을 이용해 응답 시 미리 jessionId를 저장한다.
				String url = response.encodeURL("login");
				out.print("<a href=" + url + ">로그인 상태 확인</a>");
			}else {
				out.print("<a href='login.html'>다시 로그인하세요!");
				session.invalidate();
			}
		}else {
			user_id = (String) session.getAttribute("user_id");
			if(user_id != null && user_id.length() != 0) {
				out.print("안녕하세요 " + user_id + "님!");
			}else {
				out.print("<a href='login.html'>다시 로그인하세요!</a>");
				session.invalidate();
			}
		}

	}

}

 

- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/login.html을 입력해 로그인 페이지에 접속한다.

- 아이디/비밀번호 입력 후 [로그인] 버튼을 눌러 보면 처음 로그인하는 경우 다음과 같은 화면이 나타난다.

처음 로그인 시

 

- "로그인 상태 확인" 링크를 클릭해 보면 jsessionid값이 주소창에 표시된 것을 볼 수 있다.

확인 시

 

- 대부분의 브라우저는 쿠키 사용을 기본으로 설정하고 있지만 쿠키를 사용할 없을 경우에는 encodeURL() 메서드를
이용해 세션 기능을 사용할 있다.

반응형