일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- django settings.py
- 원격 연결 포트 포워딩
- 2661 좋은 수열
- 1188 java
- 18233 비트마스킹
- 2661 java
- 14711 타일 뒤집기
- django
- apache pythonpath
- 공유기 원격 설정
- windows 원격 연결 설정
- 2961 도영이가 만든 맛있는 음식
- java di
- 2643 색종이 올려 놓기
- Problems occurred while performing provisioning operation
- 1188 음식 평론가
- django windows 배포 에러
- 2643 java
- windows apache wsgi 에러
- APPEND_SLASH = FALSE
- django The requested operation has failed!
- The requested operation has failed!
- django 웹 페이지
- django apache deploy error
- 2961 java
- 14711 java
- django httpd error
- 18233 java
- 18233 러버덕
- django 프로젝트 시작
라이브러리는 도서관 아닌가요
JSP 5 - form 태그 POST 요청, HttpServletRequest의 메서드 본문
기존 코드 & 프로젝트 생성: https://verycrazy.tistory.com/96
바로 이전 포스트( https://verycrazy.tistory.com/97?category=1033905 )에서
GET 요청을 보낼 때 쿼리 값을 붙여서 사용자의 데이터를 얻는 방법을 살펴봤다.
이런 식으로 GET에 줄줄이 쿼리 값을 붙여서 요청을 날릴 수 있겠지만,
url의 길이 제한에 걸린다.
따라서 이럴 때에는 POST 형식에 맞춰 데이터를 보낼 수 있다.
post 방식으로 데이터를 날릴 때,
html의 대강의 코드는 아래와 같다.
( 당연히 method를 get으로 지정하면 다시 GET 방식으로 변한다. )
<form action="registerMenu" method="post">
<div>
<label>메뉴 이름: </label>
<input name="menu" type="text" />
</div>
<div>
<label>설명: </label>
<input name="explanation" type="text" />
</div>
<div>
<input type="submit" value="제출" />
</div>
</form>
서블릿 클래스 안의 service 메서드 블럭에서는,
@WebServlet("사용자에게_받을_경로")
public class 머시깽이클래스 extends HttpServlet{
@Override
public void service(HttpServletRequest request, HttpServletResponse response){
String menu = request.getParameter("menu");
String explanation = request.getParameter("explanation");
~ 이하 menu, explanation 사용 코드 ~
}
}
이런 식으로 받아올 수 있다.
menu나 explanation 두 객체에 저장되는 값이
String이 아니라 null일 수도 있는 경우에 대비하여
당연히 null 처리를 해주어야 한다.
상태 유지 - application, session, cookie
사용자가 POST 같은 요청을 보낼 때 입력한 데이터는 서버 단에서 잠깐 보관한다.
따라서 데이터가 증발할 수 있는데,
이것을 찰나의 시간 동안 잡아두기 위해
서블릿 단에서 아래의 기능들을 사용할 수 있다.
1. application
2. session
3. cookie
하나씩 살펴보자.
1. application 저장
위의 HttpServlet을 구현한
서블릿 클래스 구현체에 코드를 추가해보면,
# service 메서드 안에 추가되는 코드
ServletContext application = request.getServletContext();
application.setAttribute("menu_", menu);
application.setAttribute("explanation_", explanation);
이런 식으로 변수에 받아놓고 계속 사용할 수 있다.
데이터를 꺼낼 때는,
# service 메서드 안에 추가되는 코드
String menu = (String)application.getAttribute("menu_");
return 타입이 Object 또는 null이기 때문에 이에 대한 타입 변환을 해주어야 한다.
application은 전역적인 범위에서 데이터를 뽑아 쓸 수 있는 특징이 있다.
2. session 저장
HttpSession session = request.getSession();
session.setAttribute("menu_", menu);
session.setAttribute("explanation_", explanation);
데이터를 꺼낼 때는,
String menu = (String)session.getAttribute("menu_");
application이랑 거의 뭐 다를 게 없다.
session은 말 그대로 현재 접속 중인 세션이 유지되는 동안 데이터를 저장한다.
즉 서버 단과의 연결이 종료된 후 다시 세션을 실행시키는 시점엔 기존의 저장된 데이터가 날아간다는 뜻이다.
앞서 살펴본 application과 session은
서버 단인 WAS 내부에 잡혀 있는 공간이다.
application은 공용적으로 사용하고,
session은 개별 서블릿에 할당된다.
데이터의 속성에 따라 둘에 분류하여 저장하도록 하자.
3. cookie
위와 다르게 session 보다 더욱 개별적인 공간으로
브라우저의 도움을 받는 쿠키가 있다.
따져보면 이 데이터는 사용자가 가지고 있다.
원할 때마다 쿠키를 꺼내쓸 수 있고,
사용자에게 비교적 자유롭다.
// 쿠키 저장 - "cookie"라는 이름으로 저장된 키 값
String c = request.getParameter("cookie");
Cookie cookie = new Cookie("cookie", c); // (key, value)
reponse.addCookie(cookie);
// 쿠키 읽기
Cookie[] cookies = request.getCookies(); // array
String ___c = "";
// 키 값에 해당하는 쿠키 찾기
if(cookies != null){
for(Cookie cookie : cookies){
if("cookie".equals(cookie.getName())) // search with the key value
___c = cookie.getValue();
}
}
# 항상 타입에 유의하자. =_=
// 출력
response.getWriter().println("cookie= " + ___c);
// 쿠키 받아오는 위치 설정
cookie.setPath("/특정경로/"); // 앞에서 선언된 Cookie cookie = new Cookie("cookie", c); 사용
특이한 점은 경로의 페이지가 없어 에러가 나더라도 쿠키는 잘 오간다는 점이다.
// 쿠키 제한 시간 설정
cookie.setMaxAge(3600); // 1시간 뒤에 사라지는 쿠키
쿠키가 사라지는 default 값은 브라우저 프로세스 종료 시점이다.
// 리디렉팅할 페이지 설정
response.sendRedirect("리디렉팅_할_페이지.html");
의외로 오래 저장해야 한다면 쿠키가 그 역할을 도맡는다.
아무래도 원격 서버의 session에게 주는 부담을 최소화하기 위해서이다.
서버 자원이 아무래도 공유 자원 같은 성질이 있다보니,
최대한 부담을 줄이는 게 맞지 않을까?
TMI
request 객체에는 사용자 입력 데이터가
http 헤더파일에 암호화되어 들어가 있다.
당연히 GET 보다 POST가 보안에 더 적합하다.
데이터는 key: value의 형식으로,
url이 아니라 request body의 Form Data 부분에 들어간다.
request 객체의 타입인,
클래스 HttpServletRequest의 메서드를 몇 가지만 살펴보면 ( 훨씬 많다. )
1.
String getParameter(String name)
name의 값을 알 때, name에 대한 전송값을 받아오는 데 사용한다.
2.
String[] getParameterValues(String name)
같은 name에 대해 여러 개의 값을 받아올 때 사용한다.
(<input type="text" name="hi"> ... <input type="text" name="hi">)
3.
Enumeration getParameterNames( )
name 값을 모를 때, 사용한다.
4.
void setCharacterEncoding(String charset)
charset을 변경할 때 값을 넣어 호출한다. ( "UTF-8" 따위의 )
각각의 상황에 맞춰서 GET과 POST를 사용하면 된다.
'Java > JSP' 카테고리의 다른 글
JSP 7 - model 1 to model 2 (0) | 2022.02.09 |
---|---|
JSP 6 - 서블릿의 필터 (filter) (0) | 2022.01.08 |
JSP 4 - GET 쿼리스트링 ( GET Query String ) (0) | 2022.01.04 |
JSP 3 - @WebServlet 어노테이션, 프로젝트 생성 (0) | 2022.01.04 |
JSP 2 - Context, Servlet Class (0) | 2022.01.04 |