文章目录
问题场景
最近在进行旧项目的迁移改造,技术框架是SSH3(Spring+Struts2+Hibernate)
,而项目编码是GBK
,JSP
和JS
什么都是GBK
编码。而我们现在普遍都是使用UTF-8
编码进行开发,很多技术默认就是使用UTF-8
。所以问题就出现在这里,springboot
启动程序,打开登录的JSP
页面,登录之后,原页面正常显示,但是JS
部分显示乱码。本篇博文主要是针对此种情况进行说明。
问题环境
软件 | 版本 |
---|---|
springboot | 2.1.1.RELEASE |
问题原因
target生成的文件编码问题
JS
显示乱码,那么第一个想法就是JS
编码有问题。然后我查看了出现乱码的JS
,在项目里面编码是GBK
,如下图:
然后查看了target
里面生成的文件,查看到该文件编码为UTF-8
。因为项目使用maven
进行开发,所以需要对资源设置编码,如下图:
<properties>
<project.build.sourceEncoding>GBK</project.build.sourceEncoding>
</properties>
<!-- 忽略无web.xml警告 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<resourceEncoding>GBK</resourceEncoding>
</configuration>
</plugin>
这里的maven-war-plugin
是3.2.2
。另外,在打包生成的时候,指定 -Dfile.encoding=GBK
。重新打包之后,可以看到文件编码是GBK
了。不过,如果大家觉得这里就结束了,那么就太天真了。
等升级之后,进行测试,还是不行,界面还是显示乱码。然后,这里就想,是不是因为tomcat
在返回JS
等文件的时候,进行了转换。根据这个思路,我打开了谷歌浏览器的控制台,查看乱码的JS
的抬头,看到响应参数的Content-Type
,显示application/javascript;charset=UTF-8
。而JSP
的抬头的响应参数Content-Type
为text/html;charset=GBK
。所以,这里可以根据过滤器将对应JS
或者CSS
编码进行转换。
设置过滤器进行编码转换
因为是老项目,而且项目编码是设置了GBK
,所以直接将涉及的JS
和CSS
都调整为GBK,let me show the code!
@WebFilter(urlPatterns = {
"*.js", "*.css" }, filterName = "ResourceCharacterEncodingFilter")
public class ResourceCharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String uri = request.getRequestURI().split("\\?")[0];
// 非JS、CSS不必做转换
if (!(uri.endsWith(".js") || uri.endsWith(".css"))) {
defaultDo(request, response, filterChain);
return;
}
// 设置为GBK
request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");
filterChain.doFilter(request, response);
}
private void defaultDo(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
filterChain.doFilter(request, response);
}
}
该过滤器主要是针对JS
和CSS
进行编码转换!!!
结果
添加了该过滤器,重启之后,项目访问正常,也没有出现乱码了。
总结
老项目的迁移改造,需要考虑很多东西。本篇文章主要是展示了在迁移改造过程中,遇到的问题及解决思路。
随缘求赞
如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!