Spring MVC —— form表单post提交出现乱码

主要原因是:页面提交时,使用<contentType:utf-8/>格式,而服务端HttpMessageConverter解码时使用其它格式解码(如:ISO-8859-1)导致

解决方案:在Servlet中设置CharacterEncoding为UTF-8格式。

方法一:在Web.xml中加入Spring的字符集过滤器(已测)

<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>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

encoding

字符集,将request字符集设置成encoding指定格式(相当于request.setCharacterEncoding)

forceEncoding

强制字符集设置,主要用来设置response字符集是否也是encoding指定格式

当设置为true时,相当于request.setCharacterEncoding + response.setCharacterEncoding

当设置为false时(默认),相当于request.setCharacterEncoding

加入后相当于在servlet中加入下面代码

request.setCharacterEncoding("UTF-8");    
response.setCharacterEncoding("UTF-8"); 

方法二:手动写Filter(未测)

对每个访问进行拦截,并执行下列代码

request.setCharacterEncoding("UTF-8");    
response.setCharacterEncoding("UTF-8"); 

方法三:设置HttpMessageConverter实现类的解码方式(未测试)

<mvc:annotation-driven>    
    <mvc:message-converters>    
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">    
            <property name="supportedMediaTypes">    
                <list>    
                    <value>text/plain;charset=UTF-8</value>    
                    <value>text/html;charset=UTF-8</value>    
                </list>    
            </property>    
        </bean>    
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">    
            <property name="supportedMediaTypes">    
                <list>    
                    <value>application/json; charset=UTF-8</value>    
                    <value>application/x-www-form-urlencoded; charset=UTF-8</value>    
                </list>    
            </property>    
        </bean>    
    </mvc:message-converters>    
</mvc:annotation-driven>

 

转载于:https://www.cnblogs.com/yifanSJ/p/9226801.html

### Spring MVC中注解传参乱码解决方案 在Spring MVC框架中,当使用注解方式传递参数时,可能会遇到中文乱码问题。这通常是由于字符编码不一致导致的。以下是一些常见的解决方案: #### 1. 配置前端请求的字符集 确保前端发送请求时,指定正确的字符集为UTF-8。例如,在HTML表单中可以通过`<form>`标签的`accept-charset`属性设置字符集[^3]: ```html <form action="/submit" method="post" accept-charset="UTF-8"> <input type="text" name="username" /> <button type="submit">Submit</button> </form> ``` #### 2. 配置服务器端的过滤器 在Spring MVC中,可以配置`CharacterEncodingFilter`过滤器来统一设置请求和响应的字符编码为UTF-8。通过在`web.xml`或Spring配置类中添加该过滤器,可以有效解决乱码问题。 在`web.xml`中配置示例: ```xml <filter> <filter-name>encodingFilter</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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 如果使用Java配置类,则可以通过如下代码实现: ```java @Bean public FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilter() { FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>(); CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); registrationBean.setFilter(filter); registrationBean.addUrlPatterns("/*"); return registrationBean; } ``` #### 3. 配置消息转换器 在Spring MVC中,前后端数据交互通常通过JSON格式进行。为了确保JSON数据的正确编码,可以在`springmvc.xml`中配置`HttpMessageConverter`,将默认的ISO-8859-1字符集改为UTF-8[^1]。 配置示例: ```xml <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="writeDatesAsTimestamps" value="false"/> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> ``` #### 4. 使用注解解决特定场景乱码 对于某些特定场景,如GET请求中的URL参数乱码,可以通过在Controller方法中使用`@RequestMapping`或其他组合注解(如`@GetMapping`、`@PostMapping`等)来处理[^2]。例如: ```java @PostMapping(value = "/example", consumes = "application/json;charset=UTF-8", produces = "application/json;charset=UTF-8") @ResponseBody public ResponseEntity<String> example(@RequestBody User user) { return ResponseEntity.ok("Received: " + user.getName()); } ``` #### 5. 数据库层面的字符集配置 如果乱码问题出现在数据库操作中,需要检查数据库的字符集是否为UTF-8。确保数据库、表以及字段的字符集均设置为UTF-8,并在连接字符串中明确指定字符集。 ### 总结 通过以上方法,可以从多个层面解决Spring MVC中注解传参的乱码问题。核心思想是确保整个流程中字符集的一致性,从前端到后端再到数据库,都应统一使用UTF-8编码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值