spring mvc当表单请求为application/json或enctype="multipart/form-data 过滤请求值参数,取不到请求参数问题

来源:互联网 发布:阿里云虚拟干嘛呢 编辑:程序博客网 时间:2024/06/06 22:30

1,此种情况form 非application/x-www-form-urlencoded类型

2,在spring-mvc.xml里

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
            <ref bean="byteConverter" />

             <!-- 自定义xss 字符过滤 -->            

             <ref bean="zhidingyiConverter" />
            </list>
        </property>
    </bean>

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes" value="application/json" />
    </bean>

  <!-- 自定义xss 字符过滤 -->
    <bean id="zhidingyiConverter" class="com.fastcnt.credit.intercept.XssMappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes" value="application/json" />
    </bean>
   
 <bean id="byteConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
         <property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
    </bean>

    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/" p:suffix=".jsp" p:viewClass="org.springframework.web.servlet.view.JstlView"/>

    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
        p:defaultEncoding="utf-8" />
</beans>  
3,在XssMappingJacksonHttpMessageConverter方法里重载readInternal

(XssMappingJacksonHttpMessageConverter此类为spring里的org.springframework.http.converter.json.MappingJacksonHttpMessageConverter)
重写
readInternal(Class<?> clazz, HttpInputMessage inputMessage)方法即可

@Override
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException {
        JavaType javaType = getJavaType(clazz);
        try {
            InputStream input = inputMessage.getBody();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));   
            StringBuilder sb = new StringBuilder();   
            String line = null;   
            try {   
                while ((line = reader.readLine()) != null) {   
                    sb.append(line );   
                }
            } catch (IOException e) {   
                e.printStackTrace();   
            } finally{
                input.close();
            }
            System.out.println(sb.toString());
            String body = JsonStrTrim(sb.toString());//自定义过滤
            System.out.println(body);
            InputStream is = new ByteArrayInputStream(body.getBytes());
            return this.objectMapper.readValue(is, javaType);
        }catch (JsonParseException ex) {
            throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex);
        }
    }
   


0 0