여러가지 시도 중 방법 4에 겨우 해결을 보았다.
String Uri = request.getRequestURI();
String encodeUri = UriEncoder.decode(Uri);
방법1
출처: 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);
해당 코드로 드디어 해결을 봤다.. 며칠을 이문제로 고통 받았는데 내가 이겼다.
'Spring (boot) 오류 해결' 카테고리의 다른 글
Factory method 'sqlSessionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError: com/MyBlog/Dto/Board (wrong name: (0) | 2022.02.23 |
---|---|
$.ajax 값 가져오기 오류(다른 태크 input값 가져와짐) (0) | 2022.02.22 |
JSP 날짜 변환 에러(게시판, 오늘 게시글 날짜 구분하기) (0) | 2022.02.19 |
JSTL if문 학습 (0) | 2022.02.18 |
[Spring] Request method 'GET' not supported 라는 에러, @PathVariable 기본값 설정하기 (0) | 2022.02.17 |
댓글