본문 바로가기
목차
Spring (boot) 오류 해결

스프링 URI 한글 깨짐 문제

by 지각생 2022. 2. 20.
728x90

여러가지 시도 중 방법 4에 겨우 해결을 보았다.

String Uri = request.getRequestURI();
String encodeUri = UriEncoder.decode(Uri);


방법1

Window > Preferences > General > Workspace 
하단 좌측 Text file encoding = Other: UTF-8 
변경



출처: https://denodo1.tistory.com/187 [dBack]


방법2

SpringSecurity 사용시. CsrfFilter 앞에 CharacterEncodingFilter를 놓아야 한다.

 

@Configuration

@EnableWebMvcSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity http) throws Exception {

        CharacterEncodingFilter filter = new CharacterEncodingFilter();

        filter.setEncoding("UTF-8");

        filter.setForceEncoding(true);

        http.addFilterBefore(filter,CsrfFilter.class);

        //rest of your code   

    }

//rest of your code

}

@Override
	protected void configure(HttpSecurity http) throws Exception {
		CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        filter.setForceEncoding(true);
		http
		.csrf().disable() //csrf 토큰 비활성화
		.addFilterBefore(filter,CsrfFilter.class)
		.authorizeRequests()
		.antMatchers("/","/fontawesome-free-5.15.4-web/**","/logout", "/auth/**", "/js/**", "/css/**", "/image/**", "/resources/**", "/error", "/index/**")
		.permitAll()
		.anyRequest()
		.authenticated()
	.and()
		.formLogin()
		.usernameParameter("loginUserId")//.JSP에서 전송오는 name="loginUserId"이면 default값인 username과 다르므로 해당 설정해줘야함.
		.passwordParameter("loginPpassword")
		.loginPage("/index") // 인증이 필요한 곳으로 요청오면 해당 주소로 이동
		.loginProcessingUrl("/auth/loginProc") //해당 주소에서 로그인 처리, 해당 페이지 안만들어도 시큐리티가 가로채서 username 확인하게된다.
		.failureHandler(customFailurHandler) // 실패 핸들러
		.defaultSuccessUrl("/index");
	
	}

안 먹혔다.


방법3

package utf8;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.filter.CharacterEncodingFilter;

import javax.servlet.Filter;
import java.nio.charset.Charset;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public HttpMessageConverter<String> responseBodyConverter() {
        return new StringHttpMessageConverter(Charset.forName("UTF-8"));
    }

    @Bean
    public Filter characterEncodingFilter() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return characterEncodingFilter;
    }
}

 

안먹혔다

 

오류가 떴다.

The bean 'characterEncodingFilter', defined in class path resource \

 

이렇게

스프링 부트 2.1 버전부터는 Bean Override 기능이 불가능하다고한다.

나의 경우 인코딩 설정을 'UTF-8'로 설정을 해주려고 Bean을 등록하던 도중 아래와 같은 에러 코드가 발생하였다.

The bean 'characterEncodingFilter', defined in class path resource
위와 같은 Bean 설정 오류가 발생하였을 때는 스프링 설정 파일 [.properties]에 아래와 같이 작성하자

spring.main.allow-bean-definition-overriding=true

application.properties

spring.main.allow-bean-definition-overriding=true

써주면 작동은 하지만 한글 깨짐은 해결되지 않았다.


방법4

 

(중략)

그러면 처음에 접속한 http://localhost:8080/hello?name=세계는 어떻게 redirect와 달리 파라미터가 깨지지 않았을까?
그건 브라우저가 encoding을 해서 요청을 보내기 때문이다.
브라우저 주소창에 http://localhost:8080/hello?name=세계을 치고 주소창에 있는 주소를 복사하여 텍스트 에디터에 붙여넣기하면 아래와 같은 값을 볼 수 있다.

 

문제의 원인은 파악했으니 코드로 이를 어떻게 해결할까?
해답은 아래와 같이 URLEncoder를 사용하면 된다.

@GetMapping("/redirect")
public String redirect(String name) throws UnsupportedEncodingException {
    String encodedParam = URLEncoder.encode(name, "UTF-8");

    return "redirect:/hello?name=" + encodedParam;
}

 

https://ivvve.github.io/2019/01/20/java/Spring/redirect_URL_encoding/

 

Redirect 시 한글 파라미터가 깨지는 문제

이번에 토이 프로젝트를 하면서 발견한 문제인데Spring controller에서 redirect:로 redirection 응답 시 파라미터 값에 한글이 들어가 있을 경우 ?? 로 파라미터 값이 전달되는 문제를 발견했다. 간단하지

ivvve.github.io

 

위 방법을 보고 실행보니 해결은 안됐지만 변화가 있었다.

 

변화 전 코드와 콘솔창

160행 코드 사용 후 콘솔 내용이 바꼈다.

그래서 내가 원하는건 URL이 아닌 URI이니 이것저것 바꿔보았다.

그런데 encode가 아닌 decode를 쓴

 

String Uri = request.getRequestURI();
String encodeUri = UriEncoder.decode(Uri);

해당 코드로 드디어 해결을 봤다.. 며칠을 이문제로 고통 받았는데 내가 이겼다.

728x90

댓글