Spring Cloud Zuul 中文文件上传乱码
原文地址:https://segmentfault.com/a/1190000011650034
1 描述
使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”。
1.1 解决
Spring Cloud Zuul现在对于上传文件有两种处理方式,一种是用spring mvc,另一种是zuulServlet。spring mvc对文件处理不是很好,会导致乱码问题,zuulServlet则不会。
网上比较常见的解决方案是在uri前加/zuul 使用zuul的servlet绕开springmvc来解决上传文件乱码问题
如原文:https://my.oschina.net/kmnztech/blog/1618636
比如:原来你上传文件的路径是/api/file/upload, 则你可以通过uri /zuul/api/file/upload来调用接口上传文件,中文编码问题解决。
但是,在我项目中,在api路径前加个zuul总觉得变扭,于是尝试找到一种在改变最少就能解决问题的方法。
通过阅读如官网说明。
其实你可以通过zuul.servlet-path来配置使用zuul的servlet。接着,我在网关的application.properties中添加了:
zuul.servlet-path=/
1.2 解决
对于已经固定了请求路径的来说,再次修改路径不是很好的,所以就采用如下方案:
在过滤器中,有一个pre的过滤器 ServletDetectionFilter,他的执行顺序是-3,也是最先执行的过滤器,在这个过滤器中,有这么一段代码:
public class ServletDetectionFilter extends ZuulFilter {
public ServletDetectionFilter() {
}
public String filterType() {
return "pre";
}
public int filterOrder() {
return -3;
}
public boolean shouldFilter() {
return true;
}
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
if (!(request instanceof HttpServletRequestWrapper) && this.isDispatcherServletRequest(request)) {
ctx.set("isDispatcherServletRequest", true);
} else {
ctx.set("isDispatcherServletRequest", false);
}
return null;
}
private boolean isDispatcherServletRequest(HttpServletRequest request) {
return request.getAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null;
}
}
在这个方法中,IS_DISPATCHER_SERVLET_REQUEST_KEY为false就会用ZuulServlet处理。如果没加/zuul前缀IS_DISPATCHER_SERVLET_REQUEST_KEY就会置为true,就会用spring mvc上传。会出现乱码问题。
那么我们的一个解决方案是在在进入下一个过滤器之前我们就把我们的文件上传的请求用ZuulServlet处理,所以我们可以重写这个方法,根据contentType判断请求如果是multipart就将IS_DISPATCHER_SERVLET_REQUEST_KEY置为false,那么它就会用ZuulServlet处理。
@Component
public class ServletDetectionFilterFile extends ServletDetectionFilter { @Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
if (!(request instanceof HttpServletRequestWrapper)
&& this.isDispatcherServletRequest(request)
&& !this.isMultipartContent(request)) {
ctx.set("isDispatcherServletRequest", true);
} else {
ctx.set("isDispatcherServletRequest", false);
} return null;
} private boolean isDispatcherServletRequest(HttpServletRequest request) {
return request.getAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null;
} /**
* 判断是否是multipart/form-data请求
* @param request 请求
* @return 是否是
*/
private boolean isMultipartContent(HttpServletRequest request) {
String requesType = "post";
if(!requesType.equals(request.getMethod().toLowerCase())) {
return false;
}
//获取Content-Type
String contentType = request.getContentType();
return (contentType != null) && (contentType.toLowerCase().startsWith("multipart/"));
} }
到这里还没有结束,还有一个很坑的地方,在最后以前pre过滤器中,他会对url进行处理。如果该请求是ZuulServlet处理的,那么他会把url的前面几位用的zuulServletPath替代,zuulServletPath默认就是刚才我们替代的前缀 /zuul。那么如果你不处理的话,你的请求路径将会变化。所以在这里我们将这个默认的zuulServletPath改成空值,就不会替换啦。在配置文件里面加上:
zuul.servletPath:
后面的值不填。
Spring Cloud Zuul 中文文件上传乱码的更多相关文章
- Spring Cloud Feign的文件上传实现
在Spring Cloud封装的Feign中并不直接支持传文件,但可以通过引入Feign的扩展包来实现,本来就来具体说说如何实现. 原文:http://blog.didispace.com/sprin ...
- linux tomcat 中文文件上传乱码
找到tomcat文件夹下的conf/server.xml,在connector节点下新增URIEncoding="utf-8"参数 <Connector connection ...
- Spring中MultipartHttpServletRequest实现文件上传
Spring中MultipartHttpServletRequest实现文件上传 转贴自:http://my.oschina.net/nyniuch/blog/185266 实现图片上传 用户必须能 ...
- 关于我使用spring mvc框架做文件上传时遇到的问题
非常感谢作者 原文:https://blog.csdn.net/lingirl/article/details/1714806 昨天尝试着用spring mvc框架做文件上传,犯了挺多不该犯的毛病问题 ...
- 利用spring的MultipartFile实现文件上传【原】
利用spring的MultipartFile实现文件上传 主要依赖jar包 spring-web-3.0.6.RELEASE.jar 用到 (org.springframework.web.multi ...
- Spring MVC-从零开始-文件上传(未完待续)
Spring MVC-从零开始-文件上传(未完待续)
- 巧用 Jersey RESTful WebService框架解决文件上传乱码
一.当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用.仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的 ...
- Spring MVC + Java 多文件上传及多文件中转上传
1.html内容 <div> <form method="post" action="/Cyberspace/main/informationBatch ...
- Spring中MultipartHttpServletRequest实现文件上传 生成缩略图
转贴自:http://my.oschina.net/nyniuch/blog/185266 实现图片上传 用户必须能够上传图片,因此需要文件上传的功能.比较常见的文件上传组件有Commons Fil ...
随机推荐
- puppeteer 拦截页面请求
原文链接 https://www.cnblogs.com/ajanuw/p/10324269.html Request Response page.setRequestInterception(tru ...
- 【C++ 流类库与输入输出 】实验七
1. 基础练习 (1)教材习题 11-7 (2)教材习题 11-3 (3)教材习题 11-4 2. 应用练习 (1)已知有班级名单文件 list.txt(见实验 7 附件包).编写一个应用程序实现随机 ...
- C++ 编译发现 error C2146: syntax error : missing ';' before identifier 'm_ctrlserver'
解决这个问题的根源是重复包含了头文件
- 如何关闭git pull产生的merge 信息
编辑 ~/.gitconfig [core] mergeoptions = --no-edit 或者终端之行 git config --global core.mergeoptions --no-ed ...
- Linux(CentOs 7)系统重装笔记(一)
参考文章: https://www.jb51.net/article/95263.htm https://blog.csdn.net/JackLiu16/article/details/7988182 ...
- Java反射机制概念及应用场景
Java的反射机制相信大家在平时的业务开发过程中应该很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习一下. 1. 什么是反射机制? Java反射机制是在运行状态中,对于任意一个类 ...
- 【Bad Practice】12306 query
- PHP防CC攻击代码
PHP防CC攻击代码: empty($_SERVER['HTTP_VIA']) or exit('Access Denied'); //代理IP直接退出 session_start(); $secon ...
- ubuntu下zip文件操作
转自 https://blog.csdn.net/hpu11/article/details/71524013 .zip $ zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹 ...
- JavaScript 区分中英文字符的两种方法: 正则和charCodeAt()方法
正则无疑是最强大的判断各种条件的方法, 最近也在研习它, 虽然枯燥, 但仍有乐趣. 用它来判断一个双字节的中文字符也是轻而易举地. 而判断中文字符, 简单且执行效率高. regExpForm.onb ...