springboot学习系列:JSP页面调用JS,页面显示乱码

tech2025-05-26  5

文章目录

问题场景问题环境问题原因target生成的文件编码问题设置过滤器进行编码转换 结果总结随缘求赞

问题场景

最近在进行旧项目的迁移改造,技术框架是SSH3(Spring+Struts2+Hibernate),而项目编码是GBK,JSP和JS什么都是GBK编码。而我们现在普遍都是使用UTF-8编码进行开发,很多技术默认就是使用UTF-8。所以问题就出现在这里,springboot启动程序,打开登录的JSP页面,登录之后,原页面正常显示,但是JS部分显示乱码。本篇博文主要是针对此种情况进行说明。

问题环境

软件版本springboot2.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进行编码转换!!!

结果

添加了该过滤器,重启之后,项目访问正常,也没有出现乱码了。

总结

老项目的迁移改造,需要考虑很多东西。本篇文章主要是展示了在迁移改造过程中,遇到的问题及解决思路。

随缘求赞

如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏; 如果有好的讨论,可以留言; 如果想继续查看我以后的文章,可以点击关注 可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!

最新回复(0)