관리 메뉴

프로그래밍 삽질 중

JSP 쿠키(Cookie), 파일 업로드, 오류 처리 본문

과거 프로그래밍 자료들/자바(Java)

JSP 쿠키(Cookie), 파일 업로드, 오류 처리

평부 2021. 4. 13. 22:29

※쿠키
- 상태를 유지하는 방법(세션과 쿠키)
- 쿠키는 세션과 달리 상태정보를 웹 서버가 아닌 클라이언트에 저장
ex) 회원가입 화면에 자동으로 주소, 전화번호 입력
     쇼핑몰에서 주문할 때 장바구니에서 선택한 상품 정보들 유지
     이전에 방문한 적이 있는 웹서버에 다시 방문했을 때 몇 번째 방문인지 출력
     쇼핑몰에서 클라이언트가 체크했던 상품 정보 유지


쿠키 동작 과정
1) 쿠키 생성 단계 : 응답 데이터와 함꼐 저장(response)
- 쿠키 생성
: Cookie myCookie = new Cookie(String(이름), String(값))

- 생성된 쿠키에 대한 설정 
: myCookie.setValue(String)

- 설정이 완료된 쿠키 전송 
: response.addCookie(myCookie) 
* 쿠키 생성 후 반드시 response 내장객체의 addCookie()메소드로 쿠키 설정해야 함

2) 쿠키 객체 얻기
-요청에 포함된 쿠키 가져오기 
: Cookie[] cookies = request.getCookies()

- 쿠키 이름을 얻어오기
: cookies[i].getName()

- 얻어진 이름을 통해 정보 사용
: cookies[i].getValue()

- 쿠키 삭제
: cookies[i].setMaxAge(0); //유효기간을 0으로 설정
: response.addCookie(cookies[i]);


※ 쿠키 vs 세션
- 쿠키
1) Cookie클래스
2) 저장 형식 : 텍스트
3) 저장 장소 : 클라이언트
4) 종료 시점 : 쿠키 저장 시 설정
4) 클라이언트의 리소스 사용
5) 클라이언트에 저장되므로 사용자 변경 가능, 보안에 취약

- 세션
1) HttpSession인터페이스
2) 저장 형식 : Object형
3) 서버 (세션 아이디만 클라이언트에 저장)
4) 종료시점 : 정확한 시점을 알 수 없음
5) 서버의 리소스 사용
6) 서버에 저장되어 있어 보안이 상대적으로 안정적

 

 

[예시 1]

 

<조건>

1) 파일은 총 4개(loginFrm.jsp, loginPro.jsp, logout.jsp, loginChk.jsp)

2) 아이디 : admin 비밀번호 : 1234 로 기억(로그인 성공으로 표시)

→ web.xml 이용해야 함

3) 로그인 성공 시 

로그인 성공했음

로그인 폼으로(되돌아 가기)로 표시(로그아웃도 표시)

4) 아이디가 틀릴 경우 아이디 정보 오류, 비밀번호가 틀릴 경우 비밀번호 정보 오류

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[loginFrm.jsp]

<
%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action='loginPro.jsp' method='post'>
    관리자 로그인<br>
    아이디: <input type='text' name='id'>
    <input type="checkbox" name="idRemember" value="yes">아이디 기억<br>
    비밀번호 : <input type='password' name='pwd'>
    <input type='submit' value='전송'>
</form>
</body>
</html>
cs

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
[loginPro.jsp]

<%
@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- getInitParameter(String paramName) : 
매개변수로 web.xml에 지정했던 param-name 넘겨주면 그에 해당하는 값 갖고 옴-->
<!-- <input type="checkbox" name="idRemember" value="yes">아이디 기억<br> -->
<%! String idRemember; %> 
<%
    String id = request.getParameter("id");
    String pwd = request.getParameter("pwd");
    if(request.getParameter("idRemember")==null){
        idRemember = null;
    }else{
        idRemember = request.getParameter("idRemember"); //idRemember가 null이 아니면 getParameter
    }
 
        //loginFrm에서 CheckBox가 선택된 상태 = idRemember 값 표시
        
        if(id.equals(application.getInitParameter("adminId"))&&
        pwd.equals(application.getInitParameter("adminPwd"))&&
        idRemember!=null){ //CheckBox가 선택되지 않은 상태 = null
         
        session.setAttribute("id", id);
        session.setAttribute("pwd", pwd); //session.setAttribute("설정한 세션아이디", 세션에 넣을 값);  
    
        //요청한 쿠키 갖고 오기
        Cookie[] cookies = request.getCookies();
        if(cookies.length!=2){//이 조건을 넣어줘야 loginFrm가 2번 실행되도 오류가 안남
        
        
        Cookie cookie = new Cookie("idRemember", id); /위의 조건을 다 만족 시 쿠키를 만들어 줌. 안에 값으로는 id값이 들어가야 함
        response.addCookie(cookie);
        }
%>
    로그인에 성공했음<br>
        <a href="loginChk.jsp">로그인 정보 확인</a>    
        
        //아이디만 틀릴 때
<%         }else if(!id.equals(application.getInitParameter("adminId"))&&
                pwd.equals(application.getInitParameter("adminPwd"))){
%>
    <script>                
        alert('로그인  아이디 정보 오류'); //자바스크립트 명령어임... 로그인 실패시 팝업으로 문제를 알려줌
        history.back(); // 전의 페이지로 돌아감
    </script>
 
    //비밀번호만 틀릴 때
<%    }else if(id.equals(application.getInitParameter("adminId"))&&
        !pwd.equals(application.getInitParameter("adminPwd"))){
    
%>
    <script>                
        alert('패스워드 정보 오류');
        history.back();
    </script>
    
//아이디랑 비밀번호는 맞으나 아이디 기억 체크 안했을 때
<%     }else if(id.equals(application.getInitParameter("adminId"))&&
        pwd.equals(application.getInitParameter("adminPwd"))&&
        idRemember==null){
        session.setAttribute("id", id); 
%>
 
    로그인에 성공했음<br>
    <a href="loginChk.jsp">로그인 정보 확인</a>    
<%    
    }else{
%>    
    <script>                
        alert('아이디와 패스워드 정보 둘다 오류');
        history.back();
    </script>
<%    
    }
%>
</body>
</html>
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[loginChk.jsp]
 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
아이디 <%=session.getAttribute("id") %>로 로그인 한 상태<br>
<a href='logout.jsp'>로그아웃</a>
</body>
</html>
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[logout.jsp]
 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% session.invalidate(); %>
로그아웃 완료.<br>
<a href='loginFrm.jsp'>로그인 화면으로</a>
</body>
</html>
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[web.xml]
 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  <display-name>global_jsp</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 //<context-param></context-param>부분만 입력하면 됨
  <context-param>
      <param-name>adminId</param-name>
    <param-value>admin</param-value>  
  </context-param>
  <context-param>
      <param-name>adminPwd</param-name>
    <param-value>1234</param-value>  
  </context-param>
</web-app>
cs


※파일 업로드
- 웹 브라우저 → 서버로 파일 전송, 서버에 저장
- 서버로 업로드 가능한 파일 : 텍스트 파일, 바이너리 파일, 이미지 파일, 문서 등
- JSP 페이지에서 폼 태그 사용(post방식)


※ MultipartRequest
- 웹 페이지에서 서버로 업로드 되는 파일자체만 다루는 클래스
- 웹 브라우저가 전송한 multipart/form-data 유형과 POST 방식의 요청 파라미터 등을 
   분석한 후 일반 데이터와 파일 데이터를 구분하여 파일 데이터에 접근
- 일반 데이터 : getParameter() 메소드 =/= 파일 : getFileNames() 메소드

 

[예시 2]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[upload.jsp]
 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="uploadProc.jsp" method="post" enctype="multipart/form-data">
    <input type="file" name="file"><p>
    <input type="submit" value="파일 업로드">
</form>
</body>
</html>
cs
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
32
33
34
35
36
37
[uploadProc.jsp]
 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.*,
com.oreilly.servlet.multipart.*,
java.util.*, java.io.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% String path=application.getRealPath("/upload");
int size= 1024*1024*10;
try {
MultipartRequest multi = new MultipartRequest(
        request, path, size, "UTF-8"new DefaultFileRenamePolicy());
 
Enumeration files = multi.getFileNames();
String name = (String) files.nextElement();
String file = multi.getFilesystemName(name);
long fileSize = multi.getFile("file").length();
String orgFile = multi.getOriginalFileName(name);
String type = multi.getContentType(name);
out.println("파일명" +file+"<br/>");
out.println("파일크키" +fileSize+"<br/>");
out.println("원본파일명" +orgFile+"<br/>");
out.println("콘텐츠유형" +type+"<br/>");
} catch(Exception e) {
    out.println("오류 발생" + e);
}
 
%>
</body>
</html>
cs


※ 오류 처리
- 내부 로직을 처리하는 JSP페이지 내에서 오류나 예외가 발생할 경우 사용자에게 
오류가 그대로 노출되는 것 방지, 적절히 처리
- 사용자의 잘못된 입력으로 발생하는 오류는 Javascript를 이용하여 클라이언트 선에서
막아주는 것이 서버측 트래픽 부담을 덜어 줌

 

[예시3]

 

 

정수만 입력하세요

/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[divEx.jsp]
 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% 
int num1 = Integer.parseInt(request.getParameter("num1"));
int num2 = Integer.parseInt(request.getParameter("num2"));
%>
 
<%=num1 %> / <%=num2 %> = <%= (double) num1 / (double) num2%>
<br/>
<a href="div.html">back</a>
 
<%@page errorPage="div_error.jsp" %>
 
</body>
</html>
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[divEx.jsp]
 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% 
int num1 = Integer.parseInt(request.getParameter("num1"));
int num2 = Integer.parseInt(request.getParameter("num2"));
%>
 
<%=num1 %> / <%=num2 %> = <%= (double) num1 / (double) num2%>
<br/>
<a href="div.html">back</a>
 
<%@page errorPage="div_error.jsp" %>
 
</body>
</html>
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ pafe isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
나누기 처리 중 에러가 발생했습니다.
</body>
</html>
cs