原文地址: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 中文文件上传乱码的更多相关文章

  1. Spring Cloud Feign的文件上传实现

    在Spring Cloud封装的Feign中并不直接支持传文件,但可以通过引入Feign的扩展包来实现,本来就来具体说说如何实现. 原文:http://blog.didispace.com/sprin ...

  2. linux tomcat 中文文件上传乱码

    找到tomcat文件夹下的conf/server.xml,在connector节点下新增URIEncoding="utf-8"参数 <Connector connection ...

  3. Spring中MultipartHttpServletRequest实现文件上传

    Spring中MultipartHttpServletRequest实现文件上传 转贴自:http://my.oschina.net/nyniuch/blog/185266 实现图片上传  用户必须能 ...

  4. 关于我使用spring mvc框架做文件上传时遇到的问题

    非常感谢作者 原文:https://blog.csdn.net/lingirl/article/details/1714806 昨天尝试着用spring mvc框架做文件上传,犯了挺多不该犯的毛病问题 ...

  5. 利用spring的MultipartFile实现文件上传【原】

    利用spring的MultipartFile实现文件上传 主要依赖jar包 spring-web-3.0.6.RELEASE.jar 用到 (org.springframework.web.multi ...

  6. Spring MVC-从零开始-文件上传(未完待续)

    Spring MVC-从零开始-文件上传(未完待续)

  7. 巧用 Jersey RESTful WebService框架解决文件上传乱码

    一.当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用.仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的 ...

  8. Spring MVC + Java 多文件上传及多文件中转上传

    1.html内容 <div> <form method="post" action="/Cyberspace/main/informationBatch ...

  9. Spring中MultipartHttpServletRequest实现文件上传 生成缩略图

    转贴自:http://my.oschina.net/nyniuch/blog/185266 实现图片上传  用户必须能够上传图片,因此需要文件上传的功能.比较常见的文件上传组件有Commons Fil ...

随机推荐

  1. harpoxy 配置

    HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保 ...

  2. 错误提示:未处理的“System.NullReferenceException”类型的异常出现在 system.data.dll 中。 其他信息: 未将对象引用设置到对象的实例。

    这种情况的发生一般有3种情况:1.代码中有一个对象没有初始化.例如Form A=new Form();2.连接数据库的问题.连接和打开连接的语句.3.T-SQL语句不正确,引起在访问数据库时有问题.

  3. new image()

    在js中 新建一个new image()对象,image.src图片地址,这个是io读取是异步的,解决方法 image.onload=function(){ }

  4. jmeter数据库连接配置

    一.实际试过的mysql配置 1.导入一个JDBC jar包(我是直接把jar包放在了jmeter的lib目录),包:mysql-connector-java-5.1.7-bin.jar 2.设置JD ...

  5. Django中web开发用md5加密图片名并存储静态文件夹

    一般在开发中,有的网站存在大量图片,首先图片的名称是不能重复的, 但是除了数据库可用的id以外我们可以用time模块中time.time()获取的时间来进行md5加密操作, 因为time模块所产生的时 ...

  6. linux sed 用法

    目录 Overview 命令行选项 Command-Line Options manual http://www.gnu.org/software/sed/manual/sed.html Overvi ...

  7. WebSocket(一)-RFC6455

    1.官方在线 本地下载 参考翻译:gitbook

  8. k8s-No.2-pod学习

    本章目录 pod结构图 pod语法及参数说明 pod声明周期 一  pod结构图 大部分情况下,Openshift中的Pod只是容器的载体,通过Deployment.DaemonSet.RC.Job. ...

  9. Mockito单元测试实战

    最近使用Mockito完成了几个简单的测试,写个博客mark一下: 第一种模拟web请求 @SpringBootTest @RunWith(SpringRunner.class) @WebAppCon ...

  10. volatile有什么用?能否用一句话描述volatile的应用场景

    volatile保证内存可见性和禁止指令重排.volatile用于多线程环境下的单次操作(单次读或者单次写).volatile关键字不能提供原子性.     volatile关键字为实例域的同步访问提 ...