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 코드를 작성하지 않아도 된다.
'국비교육(22-23)' 카테고리의 다른 글
32일차(3)/jsp(15) : 자료실, 파일 업로드/다운로드 기능 구현 (0) | 2022.11.22 |
---|---|
32일차(2)/jsp(14) : 회원정보 수정, 회원 탈퇴 기능 구현 (0) | 2022.11.22 |
31일차(2)/jsp(12) : 회원전용 페이지 기능 구현하기(Filter) (0) | 2022.11.21 |
31일차(1)/jsp(11) : 회원가입, 로그인 기능 구현하기 (0) | 2022.11.21 |
[참고] Eclipse에 Quantum DB 설치 (0) | 2022.11.21 |