记springboot1.5和springboot2.0的坑

首先,springboot2.0不支持jdk1.7

jdk1.7不支持mysql8+

mysql8和mysql5的区别是加密规则变了:

mysql8:caching_sha2_password       驱动是com.mysql.cj.jdbc.Driver

mysql5:mysql_native_password        驱动是com.mysql.jdbc.Driver

直接在高版本的mysql里新建一个加密方式为mysql_native_password的用户

create USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

赋所有权限

GRANT ALL PRIVILEGES ON *.* TO 'aaa'@'localhost'WITH GRANT OPTION;

查看各用户加密方式

select host,user,plugin from user;

刷新权限 ,这样的话不用重启服务
FLUSH PRIVILEGES;

查看所有数据库

show databases 

查看所有表

show tables

<think>我们面对的问题是:在Spring Boot 1.5中使用Feign客户端上传包含中文文件名的文件到Spring Boot 2.0 OpenFeign服务端时,出现文件名乱码。这通常是由于编码不一致导致的。 解决思路: 1. 确保客户端服务端的字符编码一致(通常使用UTF-8)。 2. 在Feign客户端中正确设置请求的Content-Type,并处理多部分文件上传。 3. 在服务端正确解析多部分请求,并指定字符编码。 具体步骤: 一、Feign客户端(Spring Boot 1.5)配置: 1. 添加对文件上传的支持依赖(如果尚未添加): ```xml <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.8.0</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.8.0</version> </dependency> ``` 2. 在Feign客户端接口中,使用`@RequestPart`注解`@RequestHeader`注解设置正确的Content-Type字符编码: ```java @FeignClient(name = "service-name") public interface FileUploadClient { @RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) String uploadFile(@RequestPart("file") MultipartFile file); } ``` 但是,由于文件名包含中文,我们需要确保在请求中设置字符编码。然而,默认情况下,Feign可能不会正确处理多部分请求中的文件名编码。 3. 为了解决编码问题,我们可以自定义一个编码器,将文件名编码为UTF-8: ```java import feign.form.spring.SpringFormEncoder; import org.springframework.context.annotation.Bean; import org.springframework.web.multipart.MultipartFile; public class FeignConfig { @Bean public SpringFormEncoder multipartFormEncoder() { return new SpringFormEncoder(); } } ``` 但是,`SpringFormEncoder`默认使用的是`HttpServletRequest`的默认编码(ISO-8859-1),所以我们需要修改为UTF-8。 4. 实际上,我们可以通过自定义一个`MultipartFormContentProcessor`来设置字符编码。不过,更简单的方式是在服务端也设置为UTF-8,并确保客户端在构建请求时使用UTF-8。 二、服务端(Spring Boot 2.0)配置: 在服务端,我们需要确保多部分请求的解析使用UTF-8编码。 1. 在`application.properties`(或`application.yml`)中设置: ```properties spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true # 对于Spring Boot 2.0以上,多部分文件上传的编码设置 spring.servlet.multipart.enabled=true # 设置最大文件大小最大请求大小(可选) spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` 2. 在接收文件的方法中,我们通常使用`@RequestParam("file") MultipartFile file`。Spring MVC默认使用请求的字符编码来解析文件名。如果请求的字符编码不是UTF-8,则可能导致乱码。 3. 为了确保使用UTF-8,我们可以添加一个过滤器来设置请求的字符编码: ```java import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(urlPatterns = "/*") public class CharacterEncodingFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } } ``` 或者,在Spring Boot中,我们可以使用内置的`CharacterEncodingFilter`(推荐): ```java @Bean public FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilter() { FilterRegistrationBean<CharacterEncodingFilter> filterRegistrationBean = new FilterRegistrationBean<>(); CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); filterRegistrationBean.setFilter(filter); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } ``` 4. 另外,检查服务端控制器,确保没有其他设置覆盖了字符编码。 三、如果以上方法还不能解决,考虑在Feign客户端中手动设置请求头,将文件名进行URL编码(注意:这种方式可能会改变文件名的原始形式,需要服务端相应解码): ```java @RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) String uploadFile(@RequestHeader("Content-Disposition") String contentDisposition, @RequestPart("file") MultipartFile file); ``` 但是,这种方法需要手动构建Content-Disposition,并且比较繁琐。更推荐的方式是确保整个请求链使用UTF-8编码。 总结: 1. 在客户端服务端都设置字符编码为UTF-8。 2. 在服务端添加字符编码过滤器,强制使用UTF-8。 3. 确保Feign客户端使用支持多部分上传的编码器,并检查其编码设置。 注意:由于Feign客户端的版本Spring Boot版本的差异,可能还需要调整其他配置。如果使用的是较旧的Feign版本(如Spring Cloud Netflix Feign),可能需要升级或使用其他方式。 如果问题仍然存在,可以尝试在Feign客户端配置中自定义一个`feign.RequestInterceptor`,在请求头中设置字符编码: ```java @Bean public RequestInterceptor requestInterceptor() { return requestTemplate -> { requestTemplate.header("Accept-Charset", "UTF-8"); }; } ``` 但是,多部分请求的编码主要在Content-Type中指定,例如: ``` Content-Type: multipart/form-data; charset=UTF-8 ``` 然而,根据HTTP规范,多部分请求的每个部分可以有自己的字符集,但通常文件名是在Content-Disposition头中,这个头并不在Content-Type的charset控制范围内。因此,更通用的做法是确保整个请求使用UTF-8,并且服务端能够正确解析。 因此,服务端过滤器的设置是至关重要的。 根据引用[3][4]中提到的Feign客户端使用,以及服务注册到Nacos,我们配置的Feign客户端应该能够正常工作,但需要额外关注编码问题。 请根据上述步骤尝试解决乱码问题。如果问题仍然存在,请检查网络传输过程中是否有其他组件修改了编码(如网关、代理等)。</think>### Feign客户端上传中文文件名乱码解决方案 在Spring Boot 1.5 Feign客户端与Spring Boot 2.0 OpenFeign服务端之间传输包含中文文件名的文件时,出现乱码问题通常由字符编码不一致导致。以下是完整的解决方案: --- ### 一、根本原因分析 1. **字符编码不匹配** - 客户端默认使用`ISO-8859-1`编码 - 服务端期望`UTF-8`编码 - 中文文件名在编码转换过程中损坏 2. **Feign多部分处理差异** - Spring Boot 1.5的Feign与Spring Boot 2.0的OpenFeign对多部分请求处理逻辑不同 --- ### 二、客户端解决方案(Spring Boot 1.5) #### 1. 添加Feign表单支持依赖 ```xml <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.8.0</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.8.0</version> </dependency> ``` #### 2. 自定义编码器配置 ```java @Configuration public class FeignConfig { @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(new SpringEncoder(new ObjectFactory<>(() -> messageConverters()))); } private List<HttpMessageConverter<?>> messageConverters() { FormHttpMessageConverter converter = new FormHttpMessageConverter(); converter.setCharset(StandardCharsets.UTF_8); // 强制UTF-8编码 // 添加中文文件名支持 converter.addPartConverter(new StringHttpMessageConverter(StandardCharsets.UTF_8)); converter.addPartConverter(new ResourceHttpMessageConverter()); return Collections.singletonList(converter); } } ``` #### 3. Feign接口添加编码声明 ```java @FeignClient(name = "service-name", configuration = FeignConfig.class) public interface FileUploadClient { @RequestMapping( value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE ) String uploadFile(@RequestPart("file") MultipartFile file); } ``` --- ### 三、服务端解决方案(Spring Boot 2.0) #### 1. 配置字符编码过滤器 ```java @Bean public FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilter() { FilterRegistrationBean<CharacterEncodingFilter> filter = new FilterRegistrationBean<>(); filter.setFilter(new CharacterEncodingFilter()); filter.addInitParameter("encoding", "UTF-8"); filter.addInitParameter("forceEncoding", "true"); filter.addUrlPatterns("/*"); return filter; } ``` #### 2. 配置文件上传解析器 ```yaml # application.yml spring: servlet: multipart: max-file-size: 10MB max-request-size: 10MB enabled: true http: encoding: charset: UTF-8 force: true ``` #### 3. 控制器添加编码声明 ```java @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity<String> handleUpload( @RequestPart("file") @org.springframework.http.MultipartFile MultipartFile file) { // 获取正确的中文文件名 String fileName = new String(file.getOriginalFilename().getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); return ResponseEntity.ok("上传成功: " + fileName); } ``` --- ### 四、关键验证点 1. **请求头验证** 确保请求包含: ``` Content-Type: multipart/form-data; charset=UTF-8 Content-Disposition: form-data; name="file"; filename="中文.txt" ``` 2. **网络抓包验证** 使用Wireshark检查实际传输的字节序列: - 正确UTF-8编码:`E4 B8 AD E6 96 87.txt` - 错误ISO-8859-1编码:`3F 3F 3F 2E 74 78 74`(?号替代) --- ### 五、备选方案:Base64编码传输 ```java // 客户端 String encodedFile = Base64.getEncoder().encodeToString(file.getBytes()); Map<String, String> payload = new HashMap<>(); payload.put("fileName", URLEncoder.encode(file.getOriginalFilename(), "UTF-8")); payload.put("fileData", encodedFile); // 服务端 String fileName = URLDecoder.decode(payload.get("fileName"), "UTF-8"); byte[] fileData = Base64.getDecoder().decode(payload.get("fileData")); ``` > **注意**:此方案会增加30%左右传输开销,但能彻底避免编码问题[^1]。 --- ### 六、调试建议 1. 在双方服务添加日志拦截器: ```java // 客户端日志 feign.client.config.default.loggerLevel: FULL // 服务端日志 logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter: DEBUG ``` 2. 使用Postman模拟请求验证服务端单独工作正常 --- 通过以上配置,可解决因字符编码不一致导致的中文文件名乱码问题。关键点在于强制客户端使用UTF-8编码发送多部分请求,并在服务端正确配置字符过滤器[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值