解决SpringMVC中CharacterEncodingFilter过滤器导致html乱码的问题

传统用法是直接使用Spring自带的字符编码过滤器类来设置request和response的编码
   
        encode
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
        
            forceRequestEncoding
            true
        
        
            forceResponseEncoding
            true
        
    
    
        encode
        /*
    

这样会导致客户端响应给浏览器的html资源出现乱码

解决方法:

1、创建一个继承org.springframework.web.filter.CharacterEncodingFilter的子类

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.filter.CharacterEncodingFilter;

import java.io.IOException;

@WebFilter
public class DynamicResourceEncodingFilter extends CharacterEncodingFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        String encoding = getEncoding();
        if (encoding != null) {
            if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
                request.setCharacterEncoding(encoding);
            }
            if (isForceResponseEncoding()) {
                if (!request.getServletPath().toLowerCase().endsWith(".html")) {
                    // 为html资源时,不再设置响应浏览器的编码
                    response.setCharacterEncoding(encoding);
                }
            }
        }
        filterChain.doFilter(request, response);
    }
}

doFilterInternal()方法是该类用于处理请求和响应字符编码的方法,我们仅在服务端响应浏览器html资源时,避免让其设置字符编码。

2、设置web.xml配置文件



    
        Dispatcher
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:SpringMVC.xml
        
        1
    
    
        Dispatcher
        /
    

    
        encode
        
        com.powernode.web.DynamicResourceEncodingFilter
        
            encoding
            UTF-8
        
        
            forceRequestEncoding
            true
        
        
            forceResponseEncoding
            true
        
    
    
        encode
        /*
    

    
    
        default
        *.png
        *.jpg
        *.js
        *.css
        *.html
    

大功告成。

Spirng的版本为6.0.0-M2,里程碑版本,其实现的是jakarta包下的Servlet规范,如果你使用的是更低版本的Spring,请引入javax包下的Servlet。

你可能感兴趣的:(java,tomcat,spring,html5)