파일업로드, 필터

wjdaks4945·2020년 12월 29일
0

jsp

목록 보기
24/39
post-thumbnail

파일업로드 할때와 안할때의 req차이
파일업로드 할때는 Wrapper클래스 이용

어떻게 해야 파일 업로드가 되는지가 아니라 왜 그렇게 해야되는지를 알아야 다른 프레임웤 만나도 사용 가능


post방식에서 body안에 들어가는 서버로 전달되는 진짜 데이터는 view source에 있는 것들.
파일 선택하면 그 파일이 아니라 파일에 대한 메타정보만 있음.

이렇게 설정되있어서 인코딩됬던것
->바디 안에 들어가는거 얘가 결정한다. 그럼 뭘로 바꿔야되는가 - 어떻게 바꿀 수 있는가
바디 안에 한가지 데이터만 들어가는게 아니라 여러개가 들어가야 된다.-한번에 넣으면 섞임
-> 바디를 쪼개야된다.
넘겨야 되는게 3개니까 3개로 쪼개져야됨

form 태그의 enctype이 이렇게 잡혀있어서 파라미터를 문자열로 쿼리스트링형태로 넘길 수 있었던것.


enctype=multipart/form-data로 했을때 request의 바디

각 파트안에 헤더를 가지고 있음.
name : part의 이름
filename : 파일 이름

1.원래 문자로 표현할 수 있는 데이터 - 그냥 꺼내서 쓰면 됨
2. 이진데이터 - 꺼내서 서버에 저장하고 업로드처리

-> 파라미터는 존재하지 않고 이제는 파트만 존재

서블릿에서 parameter로 꺼내면 null나온다.


common-fileupload : 서블릿스펙 2.5(고급자바수업)
오늘은 3.0 방법 써볼것임 - req.getPart()

  • web.xml에 multipart config 등록해야 part api쓸 수 있다.

덩어리를 쪼개는 것 - 청크
나중에 다시 쪼개져있는것 합쳐서 원래데이터로 만듦 -> 임시 저장할 수 있어야됨 -> location이 임시저장소
생략하면 jdk가 가지고 있는 기본 저장소 사용함.
max-request-size : req안에 파일 여러개 쪼개져 있어도 그 총합이 이거 넘으면 안된다.

파일이 너무 작아서 청크로 쪼개질 필요 없음 - 이럴때도 굳이 임시저장소에 저장해야겠냐. 그럼 입출력 빈번하게 일어남
-> 파일시스템으로 저장하는게 아니라 인메모리 방식으로 저장하는게 더 빠르다.
1m보다 적은 애들은 메모리로 저장.
생략하면 기본 10kb

설정하고 나니까 나옴
파일은 임시저장소에 놔둘게 아니라 꺼내서 영구 저장소에 저장해야 업로드 성공한것.

티어가 여러개-서버가 여러개-저장할 수 있는 공간도 여러개라는 것.
어디다 저장할 것인가?
BLOB면 db에 하면 되는데 지금 varchar2라서 이진데이터 저장못함

지금 보고있는건 개발할때보는 임시 경로. 이클립스 안에 톰캣 안에 저장됨.

객체와 뭐는 연산배열구조로 꺼낼 수 있다.

클라이언트가 선의의 클라이언트인지 장담가능?
exe파일
.jsp - 톰캣에 의해 실행됨

막는방법
1. 필요한 데이터만 입력하도록 입력 제한

마임타입이 이미지인것만 선택할 수 있게 함.
-> 검사해서 지우면 끝임.
서버에서도 검사

3 . 저장할때 원본파일이름으로 저장하지x, 확장자x
해커가 어떤 이름으로 저장될지 모르니까 실행못함.
그리고 클라이언트 파일명 중복 될 수 있음 - 그럼 덮어써짐
가장 좋은 방법
1.이름에 현재 시간 추가
2.유효아이디

키사


필터

상품등록 이미지 바꾸니까 이제 파라미터 없어져서 이전에 사용하던 방법 못씀- 하지만 그 전까지는 잘 돌아갔음.건드리고 싶지 않다.
-> 필터 적용!!!

필터 사용 목적
1. 요청 전처리 해서 요청이 가지고 있는 일부 성질 변경시키고 싶을때
2. 보안을 목적으로 접근제한 하고 싶을때. 요청 들어왔을때 정상적인 사용자인지. 그럼 뒤에있는애들은 접근자에 대해 고려할 필요가 없음.
3. 응답데이터 후처리

autentic이란 말 - 보안

예) 암호화해라 - 컨트롤러 겁나 많고 중복 많이 발생
그전에도 잘 돌아갔음
-필터

  1. 접근제어

필터구현 - WAS에 등록해야됨(->필터 WAS가 관리한다.) - 필터체인형성됨

doFilter
여기서 요청 전처리, 후처리 다 처리해야됨 - 경계선 필요
-> FilterChain.
chain.doFilter로 제어권 넘겨줘야됨.

블라인드 처리

등록, 매핑 한번에 됨. 하지만 순서 할수없음 - 이 어노테이션 쓰지 말고 web.xml에 등록하기
체인 안에서 필터는 등록한 순서를 따라감

파트의 불편한점 - 어댑터 패턴으로
1. 파트 하나당 파트 래퍼

frontController - 고급자바
얘 건들기 실음 -> filter에

request 건들 수 없어서 wrapper를 대신 만드는 것.
랩핑하는 구조,상속받는 구조

command object 공통적으로

ModelAttributeArgumentResolve

이미지의 이진데이터만 가지고 있을떄 - data 스키마
base64로 인코딩하면 데이터 크기 3배로 커짐.
사이즈 확인하고 써야됨.
이미지 사이즈 체크
크롭해서 썸네일..?
거래처 이미지

db에 이진데이터

0개의 댓글