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

问题场景

最近在进行旧项目的迁移改造,技术框架是SSH3(Spring+Struts2+Hibernate),而项目编码是GBKJSPJS什么都是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-plugin3.2.2。另外,在打包生成的时候,指定 -Dfile.encoding=GBK。重新打包之后,可以看到文件编码是GBK了。不过,如果大家觉得这里就结束了,那么就太天真了。

等升级之后,进行测试,还是不行,界面还是显示乱码。然后,这里就想,是不是因为tomcat在返回JS等文件的时候,进行了转换。根据这个思路,我打开了谷歌浏览器的控制台,查看乱码的JS的抬头,看到响应参数的Content-Type,显示application/javascript;charset=UTF-8。而JSP的抬头的响应参数Content-Typetext/html;charset=GBK。所以,这里可以根据过滤器将对应JS或者CSS编码进行转换。

设置过滤器进行编码转换

因为是老项目,而且项目编码是设置了GBK,所以直接将涉及的JSCSS都调整为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);
    }
}

该过滤器主要是针对JSCSS进行编码转换!!!

结果

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

总结

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

随缘求赞

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

猜你喜欢

转载自blog.csdn.net/u013084266/article/details/108398430