解决:客户端请求与servlet程序响应的中文乱码问题

一·问题描述:

1.客户端(浏览器)的请求路径中存在中文路径的时候,导致报错

2.后端服务器中的servlet程序,传送数据回前端浏览器的时候存在中文,导致报错。

在这里插入图片描述
在这里插入图片描述

二·报错原因:

客户端与服务器端的解析字符编码格式不一致

三·解决方案:

前提:设置项目编码格式为:UTF-8

如下图所示:
在这里插入图片描述

方案一:直接在servlet程序中设置字符集格式

public class AsynchronousServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决客户端请求中文乱码
        req.setCharacterEncoding("UTF-8");
        //统一浏览器的字符集编码格式:utf-8,解决响应中文乱码
        resp.setContentType("text/html;charset=UTF-8");
        //再添加处理业务逻辑的代码。。。。。。
    }
}

方案二:在web.xml文件中注册字符编码过滤器,使用SpringMVC框架自带的字符过滤器;

第一步:在web.xml文件中配置过滤器

<!--    注册声明过滤器,解决post乱码问题,get请求没有乱码问题-->
<filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
</filter>
<filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <!--拦截所有请求-->
        <url-pattern>/*</url-pattern>
</filter-mapping>

第二步:更改浏览器的编码格式为:UTF-8

注意:

1.浏览器编码格式的修改方法,不同浏览器的修改方式不一样;具体可以去参考网上的教程,本人这里就不列举了

2.该方案不支持,servlet的异步处理,即多线程。

方案三(推荐):在web.xml文件中注册字符编码过滤器,使用自定义的字符编码过滤器;

第一步:创建一个MyFilter类,且实现Filter接口(javax.servlet.Filter),注意Filter有很多,注意别搞错了

public class MyFilter implements javax.servlet.Filter {

    //定义一个变量,接收初始化的值
    private static String encoding=null;

    //初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //接收web.xml配置文件中的初始参数
        encoding=filterConfig.getInitParameter("encoding");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("经过过滤器doFilter()方法。。。。。。。。。。。。");
        if (encoding != null) {
            // 设置字符编码链锁
            //设置从request中取得的值或从数据库中取出的值的编码格式
            request.setCharacterEncoding(encoding);
            //(1)告诉前端浏览器响应需要的编码格式,
            //(2)并且自动修改浏览器显示的编码格式. 
            response.setContentType("text/html;charset=" + encoding);
        }
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        encoding=null;
    }
}

第二步:在web.xml文件中配置自定义过滤器

<filter>
        <filter-name>myFilter</filter-name>
        <filter-class>com.lmf.mvc.filter.MyFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
</filter>
<filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

四·综上所述:

1.三个方案的分析:

方案一:每个servlet程序都需要重写这段代码

方案二:每次都需要手动修改浏览器的编码格式

方案三:每个项目只需配置一次,因此推荐使用

2.三个方案的核心代码分析:

注意:这三行核心代码若使用,必须放在最开头位置

(1)request.setCharacterEncoding(“utf-8”)

作用:设置从request中取得的值或从数据库中取出的值的解析编码格式,只对POST方法有效,对GET方法无效。

(2)response.setContentType(“text/html;charset=utf-8”)

作用一:指定前端浏览器响应需要的编码格式;
作用二:并且自动修改浏览器显示的编码格式.。

(3)response.setCharacterEncoding(“utf-8”)

作用:只指定前端浏览器响应需要的编码格式

(4)这三行代码的详情,请点击下面链接:

https://www.cnblogs.com/runningTurtle/p/7112613.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ideal-cs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值