복붙노트

[SPRING] Servlet 3.0 용 MVC 다중 파트 업로드 양식의 문자 인코딩을 변경하는 방법

SPRING

Servlet 3.0 용 MVC 다중 파트 업로드 양식의 문자 인코딩을 변경하는 방법

나는 아주 간단한 JSP / Servlet 3.0 / Spring MVC 3.1 애플리케이션을 가지고있다.

내 페이지 중 하나에 여러 형태가 있습니다. 이러한 양식 중 하나는 사용자가 파일을 업로드 할 수 있도록하며 따라서 enctype = "multipart / form-data"로 구성됩니다. 와 결합 된 Servlet 3.0 이후에 사용 가능한 multipart-config 요소를 사용하여 web.xml 파일에 multipart 업로드를 구성했습니다. 나의 봄 환경에서.

또한 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. ==============================

    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. ==============================

    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. ==============================

    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);
        }
    }
    
  4. 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