국비교육(22-23)

32일차(1)/jsp(13) : request / session / filter 복습

서리/Seori 2022. 11. 22. 18:09

32일차(1)/jsp(13) : request / session / filter 복습

 

 

 

[ request ]

 

 

- <%%>영역 안에 준비되어있는 8개의 기본 객체!
이 중 request 와 session 을 제일 많이 쓴다.

- request영역에 문자열 key 값으로 value 를 저장한다.
- request 영역에 저장된 내용은 응답하기 전까지 유효하다.

 


- 웹브라우저가 서버에 무언가를 요청한다(링크를 누르거나, 폼을 제출하는 등 ..)

- servlet에서 요청을받아서 직접 응답할 수도 있지만, servlet에서는 html을 응답하기에는 불편하다.
- 그래서 직접 하지않고 jsp페이지로 응답을 위임시킨다.

- 최초 요청은 servlet인데 jsp로 응답하는 것! 이처럼 응답을 위임시키는 것을 forward 이동이라고 한다.

 

- request.setAttribute 로 서블릿에 담은 데이터는 사용할 수 있다. jsp에서 응답하기 전까지 유효하므로!
- forward를 여러번 시켜도 유지된다.
- jsp에다가 응답에 필요한 데이터를 전달할 때 많이 사용한다.

 

 

Q) session.setAttribute 한 내용은 언제까지 적용되는지?

A) 기본적으로

웹브라우저를 닫기 전까지 or 강제로 삭제하기 전까지(로그아웃 처리) or 

설정한 세션 유지시간 동안 어떤 새로운 요청도 하지 않았을 때까지(기본 30분) 유지된다!

 

- session 영역에 저장된 정보는 페이지를 이동해도 살아있다.

 


 

[ Session ]

 

페이지가 이렇게 보인다는것은, 조건부로 페이지를 출력한 것.

- 로그인 여부를 확인한다 → session에 id로 저장된 값이 있는지 읽어온 것.

 

 

- 서버는 불특정다수의 클라이언트의 요청을 처리한다.

- session을 사용하면 로그인 여부와 어떤 아이디로 로그인했는지 구분할 수 있다.

 

 

<loginform.jsp>

- url이라는 파라미터명으로 뭔가 넘어오는 값이 있는지 확인해본다.

- 만약 null이면, 로그인 후에 index 페이지로 가도록 한다.

 

 

- 이 값을 post 방식으로 전송할 때, url 이라는 파라미터명으로 갈 주소를 함께 전송해준다.

- url에 다른 정보가 담겨 있는 경우, 로그인 후 이동할 경로가 달라진다.

- name="url" 을 빠뜨리지 않도록 주의!

 

 

- loginform.jsp을 작성해 제출하면 login.jsp로 이동하게 된다.

- id라는 키 값으로 session에 담아놓는다. 로그인이 되어있는지 여부를 확인할 수 있도록!

 

 

- 원래 목적지 정보를 기억해서 함께 전달해주기

- 그냥 url을 전달하기도 하고(if문) / encodedUrl을 전달하기도 한다.(else문)

- get방식 파라미터로 전달할때는 반드시 인코딩을 해야한다.

 

/Step04/aaa/bbb.jsp : 인코딩 안해도 괜찮음

/Step04/aaa/bbb.jsp?num=1 : 인코딩 안해도 괜찮음

/Step04/aaa/bbb.jsp?num=2&code=a666 : 인코딩 해야 함

 

- 목적지 정보에 여러가지 정보를 같이 들고 갈 수 있다.

(목적지 경로에 목적지에 들고 갈 파라미터까지 포함된 것)

 

users/loginform.jsp?url=/Step04/aaa/bbb.jsp?num=2&code=a666

request.getParameter("url") → "/Step04/aaa/bbb.jsp?num=2" 로 인식한다.

 

- 인코딩을 하지 않으면 파란색 박스까지만 읽어내고, 그 뒷부분은 또 다른 파라미터로 여겨진다.

 

 

- 그런데 ?, =, & 같은 기호들을 특별한 기호로 바꿔놓으면(인코딩) 한번에 읽어올 수 있고,

  읽으면서 자동으로 디코딩까지 한다.

경로 전체를 한 덩어리로 인식시키기 위해 인코딩을 하는 것이다.

 

- get방식으로 전송하려면 반드시 url을 인코딩해서 집어넣어야 한다. 뒷부분 파라미터가 잘리지 않도록 하기위해서!

 

- 로그인을 실패했을 경우의 페이지 소스 보기

- loginform.jsp에서 request.getparameter(url) 하면 전체 경로를 얻어낼수 있다.

- 실패하더라도 원래 목적지 정보를 잊어버리지 않는다.

 

- / : (인코딩시) %2F

 


 

[ Filter ]

- 클라이언트의 요청을 목적지에 다다르기 전에 개입하는 것.

 

 

- filter 만드는 방법: 구현하고 doFilter메소드를 override하기. 3개의 변수가 있다.

- req.getSession(); 을 통해 session 값을 얻어낼 수 있다.

 

- 특정 경로(특정 폴더 아래의 파일)에서 로그인하지 않았을 경우, 필터링하고 개입한다.

 

chain.doFilter(request, response);

- 로그인했으면 filterchain에 있는 dofilter 메소드를 사용하면서 객체의 인자를 전달하면된다.

 

- a=xxx&b=xxx&c=xxx 방식으로 작성하는 것을 Query String 이라고 한다. get방식 파라미터의 작성법!

- 이것을 한 덩어리로 움직이게 하기 위해 인코딩을 하는 것이다.

 

- 필터가 중간에 개입했더라도, 로그인에 성공하면 원래 가려던 곳으로 보내주어야 한다.

- 필터 때문에 중간에 개입하는 경로가 생겨나는 것!

 

- filter로 인해 다른 페이지로 이동했더라도, 기존의 목적지를 읽어와서 알아서 경로에 작성되어 있다.

 

- 경로에 추가정보를 달고 갈 수 있도록 redirect 시키는 것이다.

 

- 하나하나를 외우지는 않아도 되지만, 코드의 흐름을 이해하기...

 

 

- 개인정보 페이지는 로그인하지 않으면 들어가지 못하도록 필터에서 걸러낸다.

- /users/private/ 폴더 하위의 요청은 모두 필터를 거치기 때문에, redirect 된다.

 


 

- Filter로 한글 인코딩 처리하기

 

<EncodingFilter> 클래스 생성

package test.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

// "/*"는 이 프로젝트에 오는 모든 요청에 대해서 필터링을 하겠다는 의미
//Step04_Final/ 하위의 모든 요청

@WebFilter("/*")
public class EncodingFilter implements Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//1. 만일 인코딩 설정이 되지 않았다면
		if(request.getCharacterEncoding()==null) {
			//post방식 전송했을때 한글 깨짐 방지
			request.setCharacterEncoding("utf-8");
		}
		//2. 요청의 흐름 이어가기
		chain.doFilter(request, response);
	}	
}

 

- 구현하고 doFilter 메소드 override하기

 

@WebFilter(" /* ")

- 프로젝트의 Context path 에 있는 모든 요청이 이 필터를 거치도록 한다.

 

- 이렇게 fliter를 만들어두면 페이지마다 encoding utf-8 코드를 작성하지 않아도 된다.