1.  실행되는 순서가 다르다. / 관리되는 컨테이너가 다르다 ( Filter -> web container / Interceptor -> Spring container)

  why?

  filter는 자바에서 제공하는 

 interceptor는 스프링에서 제공 -> DispatcherServlet에 의해 호출됨 -> HttpServletRequest, HttpServletResponse 객체를 변경할 수 없다! ( filter는 가능)

 

 

 

2. 어댑터 또는 데코레이터 패턴 적용여부

Filter O

   -> filter의 경우 디스펫치서블렛 불리기 이전이므로 /

서블릿 리퀘스트를 요청받아 -> HTTP서블릿 리퀘스트 -> filter -> chain.doFilter

doFilter 에서 요청(Request)/ 응답(Response) 변경할 수 있음

 

-> Filter에서 선택적으로 요청, 응답 객체를 사용자 정의 구현체로 래핍하여 어댑터(래퍼), 또는 데코레이터 패턴으로 적용가능

 

Interceptor X

 

래퍼 없을땐 1번만 적용됨
래퍼 재정의 해서 반복가능

3. 이러한 이유로

Filter 

< 스프링과 무관하게 전역적으로 처리해야하는 작업, 웹 어플리케이션에 전반적으로 사용되는 기능>

@ 공통된 보안 및 인증

   - 전역적으로 해야하는 보안 검사 (XSS,CSRF 방어 등)

@ 모든 요청에 대한 로깅 또는 감사 (위험 관리)

@ 이미지/ 데이터 압축 및 문자열 인코딩

@ Spring과 분리하려는 모든 기능

 

대표적으로 SpringSecurity가 Filter 기반의 인증 및 인가를 검사 할 수 있다. 따라서 Spring MVC에 종속적이지 않다

 

Interceptor

<클라이언트 요청과 관련되어 전역적으로 처리해야하는 작업>

@ 세부적인 보안 및 인증

  - 클라이언트 요청과 관련된 인증, 인가 작업.

 특정 그룹의 사용자에 대한 기능 제한 등

@API 호출에 대한 로깅 또는 감사

@Controller로 전달되는 정보의 가공

 

 

https://www.youtube.com/watch?v=nQizVrBYCO0&t=559s

'WEB Creator > [Spring]' 카테고리의 다른 글

[Spring] @Controller와 @RestController  (0) 2022.08.31
[Spring] File Download  (0) 2022.08.25
[Spring] File Upload  (0) 2022.08.25

2. 파일 다운로드


1) 우선순위 지정
2) DownloadView.java 기능 사용을 위해 bean으로 등록
3) jsp 페이지에 다운로드용 버튼 하나 만들고 요청경로 지정
4) Controller에서 해당 요청 처리 매핑메서드 만들어 DownloadView의 기능 호출

 

2-1 우선순위 지정

AppServlet > Servlet-context 에 들어가서 해당 코드 입력하기

 

	<!--  InternalResourceViewResolver 보다 우선순위를 높게해서 먼저 다운로드에 관하는
    				beannameViewResolve 실행되게끔 -->
	<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<beans:property name="order" value="0"></beans:property>
	</beans:bean>

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
		<beans:property name="order" value="1"></beans:property>
	</beans:bean>

 

 

2-2 Downloadview 기능을 위한 bean등록

 

 

AppServlet > root-context 에 들어가서 해당 코드 입력

<bean id="fileDown" class="com.upload.util.DownloadView" />

 

src/main/java > com.upload.util 패키지 생성후

해당 java 클래스 만들기

 

package com.upload.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.FileCopyUtils;
import org.springframework.web.servlet.view.AbstractView;

public class DownloadView extends AbstractView {
	
	public DownloadView() {
		setContentType("application/download; charset=utf-8"); 
	}
	@Override							
	protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
			HttpServletResponse response) throws Exception {		

		File file = (File)model.get("downloadFile");		
		response.setContentType(getContentType()); 			
		response.setContentLength((int)file.length());		
		
		String fileName = java.net.URLEncoder.encode(file.getName(), "UTF-8"); 
		response.setHeader("Content-Disposition", "attachment;filename=\""+fileName+"\";");  
		response.setHeader("Content-Transfer-Encoding", "binary");
		
		OutputStream out = response.getOutputStream();		
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(file);		
			FileCopyUtils.copy(fis, out);			
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(fis != null) { try {fis.close();}catch(Exception e2) { e2.printStackTrace(); } }
			out.flush();
		}
	}
}

 

 

2-3 jps 페이지에 다운로드용 버튼 만들고 요청경로 지정

 

helloDown.jsp

window.location='/upload/download  요청경로지정

<%@ 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>
	<h2> hello down page</h2>
	<h3> 다운을 받고 싶으면 아래 버튼을 누르세요 !!!</h3>
	<button onclick="window.location='/upload/download'"> 다운로드  </button>
</body>
</html>

 

 

 

 

2-4  Controller에서 해당 요청 처리 매핑메서드 만들어 DownloadView의 기능 호출

 

	// 다운로드 버튼 띄운 화면	
	@GetMapping("helloDown")
	public void helloDown() {
		
	}

	// 다운 요청 처리
	@GetMapping("download")
	public ModelAndView down() {
		// 다운 시킬 파일 준비
		File f = new File("C:\\img\\ham.jpg");
		// 생성자 매개변수
		// String viewName 		:	view 이름 -> xml 지정한 downloadView 빈의 id값
		// String modelName		:	파라미터명 지정 (이름) 
		// Object modelObject	:	데이터 (다운 시킬 파일)
		ModelAndView mv = new ModelAndView("fileDown", "downloadFile", f);  //root에 bean으로 fileDown 만듦 그 다음 dowloadFile 키와 f라는 value를 줌 
		return mv;
	}
}

'WEB Creator > [Spring]' 카테고리의 다른 글

[Spring] Filter와 Interceptor의 차이점  (0) 2022.09.08
[Spring] @Controller와 @RestController  (0) 2022.08.31
[Spring] File Upload  (0) 2022.08.25

spring mvc 에서 파일 업로드 다운로드 하는 방법!

 

 

1. 파일 업로드

 

1-1 라이브러리 추가 (pom.xml에 추가)

commons-fileupload, commons-io.jar 추가하기 

 

		<!-- 파일업로드용 라이브러리 2개 추가 -->
		<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
		<dependency>
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
		    <version>1.4</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
		<dependency>
		    <groupId>commons-io</groupId>
		    <artifactId>commons-io</artifactId>
		    <version>2.6</version>
		</dependency>

1-2 MultipartResolver 추가 (root-context.xml)

	<!--  파일 업로드 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="-1"></property>  <!-- '-1' 은 파일크기 무제한 -->
		<property name="defaultEncoding" value="UTF-8"></property>
	</bean>

 

 

1-3 파일 업로드 view(jsp) 작업 

 

간단하게 파일 uploadForm과  uploadPro 만들고

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>uploadform</title>
</head>
<body>

	<h2> File Upload</h2>  //post!! multipart 로 보내기!!
	<form action="/upload/uploadPro" method="post" enctype="multipart/form-data">
		message : <input type="text" name="msg" /> <br/>
		file 	: <input type="file" name="img" /> <br/>
		message : <input type="submit" value="전송" /> <br/>
	</form>

</body>
</html>



-------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>upload Pro</title>
</head>
<body>

</body>
</html>

 

 

 

1-4 파일 업로드 컨트롤러 작업 

 

 파일업로드 작업
MultipartHttpServletRequest 인터페이스

* 주요 메서드
Iterator<String>  getFileNames() : 업로드된 파일들의 파라미터 명 리턴
MultipartFile getFile(String name) : 파라미터명이 name인 파일 리턴
List<MultipartFile> getFiles(String name) : 파라미터명이 name인 업로드 파일 정보 목록 리턴

* 작업 순서
- 처리 매핑 메서드에 매개변수 MultipartHttpServletRequest 지정
- request에서 파일 정보 꺼내담기
- 파일 저장 경로 + 새파일명 만들어 File 객체 만들기 (파일 이름 중복 안되게)
- .transferTo() 메서드로 파일 저장

package com.board.controller;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping("/upload/*")
@Log4j
public class UploadController {
	
	@GetMapping("uploadForm")
	public void upload() {
		log.info("upload form!!!!!!!!!!!!!!");
	}
	
	@PostMapping("uploadPro")
	public void uploadPro(String msg, MultipartHttpServletRequest request) { // msg(text), img(file) 
		log.info("*********upload pro*************");
		log.info("********* msg : " + msg );
		//log.info("********* img content type : " + request.getContentType());
		//log.info("********* img : " + request.getFile("img")); // 파일 정보 꺼내기
		
		try {
			// 전송한 파일 정보 꺼내기
			MultipartFile mf = request.getFile("img");
			log.info("****************** original file name : " + mf.getOriginalFilename());
			log.info("****************** file size : " + mf.getSize());
			log.info("****************** file contentType: " + mf.getContentType());
			
			
			// 파일 저장 경로
			String path = request.getRealPath("/resources/save");
			log.info(" save path : "+ path);
			// 새파일명 생성
			String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();  // 하이픈 다 빼버림 대문자로
			log.info("***********uuid : " + uuid);
			// 업로드한 파일 확장자만 가져오기 
			String orgName= mf.getOriginalFilename();
			// beach.jpg   -> .jpg만 두고 나머지는 지움
			String ext = orgName.substring(orgName.lastIndexOf("."));
			
			// 저장할 파일명
			String newFileName = uuid + ext;
			log.info("*****new fileName : " + newFileName);
			
			//저장할 파일 전체 경로
			String imgPath = path + "\\" + newFileName;
			log.info("****imgPath : " + imgPath);
			
			
			// 파일저장
			File copyFile = new File(imgPath);
			mf.transferTo(copyFile);
			
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

'WEB Creator > [Spring]' 카테고리의 다른 글

[Spring] Filter와 Interceptor의 차이점  (0) 2022.09.08
[Spring] @Controller와 @RestController  (0) 2022.08.31
[Spring] File Download  (0) 2022.08.25

+ Recent posts