[SPRING] Servlet 3.0 용 MVC 다중 파트 업로드 양식의 문자 인코딩을 변경하는 방법
SPRINGServlet 3.0 용 MVC 다중 파트 업로드 양식의 문자 인코딩을 변경하는 방법
나는 아주 간단한 JSP / Servlet 3.0 / Spring MVC 3.1 애플리케이션을 가지고있다.
내 페이지 중 하나에 여러 형태가 있습니다. 이러한 양식 중 하나는 사용자가 파일을 업로드 할 수 있도록하며 따라서 enctype = "multipart / form-data"로 구성됩니다.
또한 Spring의 org.springframework.web.filter.CharacterEncodingFilter가 구성되어 있습니다.
내가 가진 문제는 StandardServletMultipartResolver의 기본 인코딩을 UTF-8로 설정할 수있는 방법을 찾을 수 없다는 점입니다. UTF-8은 여러 부분으로 된 양식의 텍스트 필드 내용이 왜곡 될 수 있습니다.
이 문제를 해결할 방법이 있습니까?
미리 감사드립니다.
web.xml config :
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>foo-web</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF\applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>foo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>0</load-on-startup>
<multipart-config>
<max-file-size>52428800</max-file-size>
<file-size-threshold>5242880</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>foo</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>login</welcome-file>
</welcome-file-list>
해결법
-
==============================
1.StandardMultipartResolver를 사용하여 기본 인코딩을 설정하는 방법을 찾지 못했기 때문에 서블릿 3.0 구성을 덤프하고 이전의 CommonsMultipartResolver에갔습니다.
StandardMultipartResolver를 사용하여 기본 인코딩을 설정하는 방법을 찾지 못했기 때문에 서블릿 3.0 구성을 덤프하고 이전의 CommonsMultipartResolver에갔습니다.
내 봄 서블릿 컨텍스트에서 이렇게 구성 :
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- one of the properties available; the maximum file size in bytes --> <property name="maxUploadSize" value="157286400" /> <property name="maxInMemorySize" value="5242880"/> <property name="defaultEncoding" value="utf-8"/> </bean>
결국, 표준 MultipartResolver의 내부에서 CommonsMultipartResolver에 위임하기 때문에 많은 차이는 없습니다.
사실 web.xml과 서블릿 컨텍스트 둘 다에서 구성해야하기 때문에 서블릿 3.0 접근법이 더 번거롭고 기본 인코딩을 설정할 수있는 능력이 없어졌습니다.
-
==============================
2.또한 Servlet 3 API를 사용할 때 인코딩 문제가있었습니다. 몇 가지 연구를 한 후에 Tomcat 7에 특정 조건에서 올바른 인코딩으로 매개 변수를 읽을 수 없도록 만드는 버그가 있음을 발견했습니다. 해결 방법이 있습니다. 먼저 인코딩이 실제로 어떤 것인지를 알아야합니다 (기본값 iso-8859-1이 아닌 경우).
또한 Servlet 3 API를 사용할 때 인코딩 문제가있었습니다. 몇 가지 연구를 한 후에 Tomcat 7에 특정 조건에서 올바른 인코딩으로 매개 변수를 읽을 수 없도록 만드는 버그가 있음을 발견했습니다. 해결 방법이 있습니다. 먼저 인코딩이 실제로 어떤 것인지를 알아야합니다 (기본값 iso-8859-1이 아닌 경우).
request.setCharacterEncoding("UTF-8");
이것은 기본적으로 Spring의 CharacterEncodingFilter가하는 것입니다. 지금까지는 이상한 것이 없습니다. 이제 트릭. 이것을 불러라.
request.getParameterNames()
이 메소드가 getParts ()보다 먼저 호출되는지 확인하십시오. Spring을 사용하고 있다면 Spring에서 요청이 끝나기 전에 필터에서이 작업을 수행해야합니다. 메소드가 호출되는 순서가 중요합니다.
업데이트 : Tomcat 버그는 7.0.41 이후로 수정되었으므로 Tomcat의 최신 버전을 사용하는 경우 올바른 결과를 얻으려면 문자 인코딩 만 설정하면됩니다.
-
==============================
3.holmis83을 제안하고 잘 작동하면서 필자는 다중 필터를 만들었습니다.
holmis83을 제안하고 잘 작동하면서 필자는 다중 필터를 만들었습니다.
public class MyMultiPartFilter extends MultipartFilter { Logger logger = LoggerFactory.getLogger(MyMultiPartFilter.class); @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); request.getParameterNames(); super.doFilterInternal(request, response, filterChain); } }
from https://stackoverflow.com/questions/9055025/how-to-change-the-character-encoding-for-servlet-3-0-spring-mvc-multipart-upload by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] HIbernate 매핑 예외 : PropertyNotFoundException : setter를 찾을 수 없습니다. (0) | 2019.04.06 |
---|---|
[SPRING] 스프링 부트에 외부 리소스 폴더 추가 (0) | 2019.04.06 |
[SPRING] grails의 환경 특정 web.xml? (0) | 2019.04.06 |
[SPRING] 오류 페이지 - JSP에서 스택 추적을 인쇄하는 방법 (0) | 2019.04.06 |
[SPRING] H2 SQL 문법 예외 (0) | 2019.04.06 |