Cookie 와 Session
cookie
웹브라우저에서 서버로 어떤 데이터를 요청하면 서버측에서 알맞은 로직 수행 후 데이터를 웹브라우저로 응답 후 서버는 웹브라우저와의 관계를 종료함(무상태 서버, 무상태 로직) 응답 후 관계를 끊는것은 http 프로토콜의 특징, 연결이 끊겼을 때 어떤 정보가 지속적으로 유지하기 위한 수단으로 쿠키라는 방식을 이용함.
- 쿠키는 서버에서 생성 후 서버가 아닌 클라이언트 측에 정보를 저장함.
- 서버에 요청할때마다 쿠키의 속성값을 참조 또는 변경 가능함.
- 쿠키는 4kb로 용량이 제한적이며, 300개까지 데이터 정보를 가질 수 있음.
쿠키 문법
- 쿠키 생성 : 쿠키 클래스 이용
- 속성 설정 : setter를 이용
- response 객체에 쿠키 탑재 : response.addCookie() 를 이용
- 쿠키 관련 메소드
메소드명 | 설명 |
---|---|
setMaxAge() | 쿠키 유효기간을 설정 |
setPath() | 쿠키사용의 유효 디렉토리를 설정 |
setValue() | 쿠키의 값을 설정 |
setVersion() | 쿠키의 버전을 설정 |
getMaxAge() | 쿠키 유효기간 정보를 얻음 |
getName() | 쿠키 이름을 얻음 |
getPath() | 쿠키 사용의 유효 디렉토리 정보를 얻음 |
getValue() | 쿠키의 값을 얻음 |
getVersion() | 쿠키버전을 얻음 |
<%
Cookie cookie = new Cookie("id","pw");
cookie.setMaxAge(60*60); //1시간
response.addCookie(cookie);
%>
<a href="Cookieget.jsp">getCookie</a>
- 쿠키객체 생성 및 유효시간 설정한뒤 응답객체에 쿠키를 넣어둠.
<%
Cookie[] cookies = request.getCookies();
for(Cookie cook : cookies){
out.print(cook.getName());
out.print(cook.getValue()+ "</br>");
}
%>
<a href="Cookiedelete.jsp">delete cookie</a>
- 넘겨받은 쿠키의 이름과 값을 가져옴.
<%
Cookie[] cookies = request.getCookies();
for(Cookie cook : cookies){
cook.setMaxAge(0);
response.addCookie(cook);
}
%>
<a href="Cookielist.jsp">cooklist</a>
- 쿠키의 유효시간을 0으로 설정한뒤 다시 응답객체에 쿠키를 담아둠
<%
// 배열로 들어올수 있으므로 배열로 담음.
Cookie[] cookies = request.getCookies();
for(Cookie cook : cookies){
// 반복문 이용해서 cook 속성관련 값 가져옴
out.println(cook.getName()+ "</br>");
out.println(cook.getValue()+ "</br>");
}
%>
- 유효시간을 0으로 설정해 쿠키가 삭제된걸 확인할수있음.
session
세션이란 서버와의 관계를 유지하기 위한 수단임. 쿠키와 달리 클라이언트의 특정 위치에 저장되는것이 아닌 서버상에 객체로 존재함. 세션은 서버에서만 접근이 가능하여 보안이 좋고, 저장할 수 있는 데이터의 한계가 없음(각 요청마다 세션 객체가 생성됨.)
- 세션은 클라이언트의 요청이 발생하면 자동생성됨.
- 클라이언트 요청(웹브라우저) > session 자동 생성 > Session 속성 설정(session 내부 객체의 메소드 이용)
세션 문법
- 관련 메소드
메소드명 | 설명 |
---|---|
setAttribute() | 세션에 데이터를 저장함. |
getAttribute() | 세션에서 데이터를 얻어옴 (Object 타입으로 받아옴.) |
getAttributeNames() | 세션에 저장되어 있는 모든 데이터의 이름(유니크한 키값) 을 얻음 |
getId() | 자동생성된 세션의 유니크한 아이디를 얻음 |
isNew() | 세션이 최초 생성되었는지 이전에 생성된 세션인지 구분 |
getMaxInactiveInterval() | 세션의 유효시간을 얻음(가장 최근 요청시점을 기준으로 카운트) |
removeAttribute() | 세션에서 특정 데이터를 제거 |
Invalidate() | 세션의 모든 데이터를 삭제 |
// login.html
<form action="login.jsp" method="post">
<input type="text" name="id" size="10" />
<input type="text" name="pw" size="10" />
<input type="submit" value="전송">
</form>
// login.jsp : login 에서 보낸 값을 getParameter 메소드를 통해 가져온 뒤 비교 후 페이지이동
<%
//html 에서 입력한 값을 가져옴.
String id = request.getParameter("id");
String pw = request.getParameter("pw");
// 가져온 값 비교
if(id.equals("coin") && pw.equals("1000")){
session.setAttribute("id", id);
response.sendRedirect("pass.jsp");
} else{
response.sendRedirect("login.html");
}
%>
// pass.jsp
<%
//모든 데이터의 키값을 가져와 열거형으로 저장
Enumeration enumeration = session.getAttributeNames();
//값을 차례대로 가져오기위해 hasMoreElements 메소드 사용
while(enumeration.hasMoreElements()){
// 가져온 값을 sName 에 담음.
String sName = enumeration.nextElement().toString();
//id 값을 value 에 다시 담은뒤 출력
String sValue = (String)session.getAttribute(sName);
if(sValue.equals("coin")){
out.print(sValue);
}
}
%>
<a href="logout.jsp">logout</a>
// logout.jsp
<%
Enumeration enumeration = session.getAttributeNames();
while(enumeration.hasMoreElements()){
String name = enumeration.nextElement().toString();
String value = (String)session.getAttribute(name);
//열거형으로 저장된 value 값을 가져온 뒤 비교 후 세션 삭제
if(value.equals("coin")){
session.removeAttribute(name);
}
}
response.sendRedirect("sessionList.jsp");
%>
//sessionList.jsp : 저장한 세션을 삭제 후 확인용
<%
Enumeration enumeration = session.getAttributeNames();
int i = 0;
// i의값이 남아있다면 while 문을 돌아 세션의 값을 출력함.
while(enumeration.hasMoreElements()){
i++;
String sName = enumeration.nextElement().toString();
String sValue = (String)session.getAttribute(sName);
out.print(sName + "</br>");
out.print(sValue + "</br>");
}
if(i == 0) out.print("세션 없음");
%>
예외 페이지
지시자를 이용한 예외 처리
// page 지시자 속성중 errorPage 키워드를 사용
<%@ page errorPage="errorPage.jsp(페이지명)">
// errorPage.jsp
// 지시자를 사용해 isErrorPage 가 예외가 발생했을때 보여주는 페이지라고 명시
<%@ page isErrorPage="true" %>
// 에러페이지 에서는 예외가 발생한게 아니기 때문에 status 를 200으로 설정
<% response.setStatus(200); %>
// body 에서 예외 메세지를 출력하기위해 exception 객체 사용 후 메세지 불러옴
<%= exception.getMessage() %>
web.xml 을 이용한 예외 처리
// web.xml 에 공통에러 페이지 설정
<error-page>
<error-code>404</error-code>
//에러가 발생하면 넘어갈 페이지 설정
<location>/404code.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500code.jsp</location>
</error-page>
// 404code.jsp 설정
// 에러 발생 시 해당페이지는 정상적인 페이지라고 설정해둠.
<% response.setStatus(HttpServletResponse.SC_OK); %>
Bean
반복적인 작업을 효율적으로 하기 위해 빈을 사용, JAVA 언어의 데이터(속성)와 기능(메소드) 로 이루어진 클래스. jsp 페이지를 만들고 액션태그를 이용하여 빈을 사용함.
- 관련 액션 태그(useBean, setProperty, getProperty)
주로 업데이트하고, 얻어오는 역할
- useBean : 특정 Bean 을 사용한다고 명시할때 사용 ```java
- Scope 범위 옵션 - page : 생성된 페이지 내에서만 사용 가능 - request : 요청된 페이지 내에서만 사용 가능 - session : 웹브라우저의 생명주기와 동일하게 사용 가능 - application : 웹 어플리케이션 생명주기와 동일하게 사용 가능 - setProperty : 데이터 값을 설정할 때 사용 ```java <jsp:setProperty name="빈이름" property="속성이름" value="속성(데이터) 값"/>
-getProperty : 데이터값을 가져올 때 사용
<jsp:getProperty name="빈이름" property="속성이름">
- 사용 예시 ```java public class Student { private String name; private int age; private int grade; private int studentNum; public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } public int getStudentNum() { return studentNum; } public void setStudentNum(int studentNum) { this.studentNum = studentNum; } }
//사용 시 선언해둘것.
//데이터 사용 시 setProperty 사용해서 데이터 추가
//데이터 불러올 시 getProperty 를 사용
이름:
## 커넥션 풀 (DBCP)
> 클라이언트에서 다수의 요청이 발생할 경우 데이터베이스에 부하가 발생함 이러한 문제를 해결 하기 위해 커넥션 풀 기법을 사용. 케넥션 객체를 어느정도 미리 생성을 해두고 사용. tomcat 의 context.xml 파일에 추가
```java
//server > context
<Resource
auth = "Container"
driverClassName = "oracle.jdbc.driver.OracleDriver"
url = "jdbc:oracle:thin:@localhost:1521:xe"
username = "web_user"
password = "oracle"
name = "jdbc/Oracle11g"
type = "javax.sql.DataSource"
maxActive = "50"
maxWait = "1000">
</Resource>
// DAO(db 연결 클래스)
private DataSource dataSource;
public MemberDAO() {
Context context;
try {
context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/Oracle11g");
} catch (NamingException e) {
e.printStackTrace();
}
}
public ArrayList<MemberDTO> memberSelct(){
ArrayList<MemberDTO> dtos = new ArrayList<MemberDTO>();
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM JOIN";
try {
//데이터 연결 방법이 기존과 다름.
con = dataSource.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()) {
String name = rs.getString("name");
String id = rs.getString("id");
String pw = rs.getString("pw");
String phone1 = rs.getString("phone1");
String phone2 = rs.getString("phone2");
String gender = rs.getString("gender");
MemberDTO dto = new MemberDTO(name, id, pw, phone1, phone2, gender);
dtos.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return dtos;
}