기본적으로 /resources/static/ 폴더 안에 파일을 읽어오지만
그 외의 외부폴더에서 파일을 참조할 경우 보안상의 문제로 파일을 불러오지 않는다
파일이 동적으로 생성되거나 관리가 되어야 하는 상황에 맞지 않기에 동적으로 관리하는 방법을 정리해 본다
(파일이 배포된 상태 거나 War 상태일 경우 /resources/static/ 안에 파일을 넣으려면 재배포 및 War를 빌드해야 한다)
폴더 생성
src/main/resources 가 아닌 src 폴더와 같은 위치에 upload 폴더를 생성하였다
(C:// , D:// 가 아닌 프로젝트 내의 폴더에서 파일을 관리하고 싶어서)
예시 화면
강아지 사진 옆에 태그를 추가하여 본다
config 파일 생성
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.file.Path;
import java.nio.file.Paths;
@Configuration
public class WebConfig implements WebMvcConfigurer {
private String connectPath = "/uploadPath/**";
final Path FILE_ROOT = Paths.get("./").toAbsolutePath().normalize(); // resources 폴더가 아닌 위치 일때 , 현재 위치를 지정함
private String uploadPath = FILE_ROOT.toString() + "/upload/";
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler(connectPath) // src 에 들어갈 경로
.addResourceLocations("file:///"+uploadPath); // 파일 경로
}
}
SpringSecurity 사용 중이라면
@EnableWebSecurity
@Configuration
public class WebSecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf().disable(); // @EnableWebSecurity 이 csrf 공격을 방지하기 때문에 해당 기능을 disable로 변경
http
.authorizeRequests()
.requestMatchers("/").hasRole("USER") // 권한체크 - 내부적으로 ROLE_ 을 붙이기 때문에 ROLE_ 뒷부분만 적어준다
.requestMatchers("/board/create").hasAnyRole("ADMIN") // 권한체크 - 내부적으로 ROLE_ 을 붙이기 때문에 ROLE_ 뒷부분만 적어준다
.requestMatchers("/bootstrap/**", "/login", "/register", "/logout" , "/start" , "/stop" , "/uploadPath/**").permitAll() // 해당 경로는 권한이 없어도 접속할 수 있다
.anyRequest().authenticated();
....
...
...
..
.
config.java 에서 설정한 connectPath 의 경로인 "/uploadPath/**" 를 권한과 상관없는 예외 처리를 해야 한다
처리를 하지 않으면 오류도 출력되지 않아 찾기 힘들다...
이미지 태그 경로 설정
결과
'개발 > Spring' 카테고리의 다른 글
[SpringBoot] WebSocket 채팅 테스트 (0) | 2024.06.09 |
---|---|
[SpringBoot] Cors 적용 및 테스트 하기 (0) | 2024.05.11 |
[SpringBoot] DataTable(JavaScript) - 적용하기 (0) | 2024.05.05 |
[SpringBoot] Thymeleaf - layout 적용하기 (0) | 2024.04.21 |
[SpringBoot] Scheduler(스캐줄러) 사용하기, cron 표현식 (0) | 2023.05.14 |
댓글