Servlet之中文乱码的解决办法

一、原因分析

解码的字符集编码字符集的不一致

数据来源默认编码格式
浏览器页面GBK
request(get)ISO-8859-1
request(post)GBK(同浏览器),但是如果是服务器来的页面一般已经设置了UTF-8(例如JSP提交的页面)
Servlet(response)ISO-8859-1

二、乱码处理方式

1.服务器端接收中文乱码

解决post提交方式的乱码

    request.setCharacterEncoding("UTF-8");

解决get提交方式的乱码

    //先以默认方式解码,再以uft-8编码
    String str = newString(str.getbytes("iso8859-1"),"utf-8");

采用过滤器FilterProxy动态代理解决Get/Post方法乱码问题(对request方法进行增强

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.mark.demo.filter.CharacterEncodingFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
//为解决全站乱码
public class CharacterEncodingFilter implements Filter {

    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        //对get提交的数据还是没有办法对其改变编码,所以要对request的getParameter方法缺少功能了
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //放行的是自己的包装类
        MyCharacterEncodingRequest requestWrapper = new MyCharacterEncodingRequest(
                request);
        chain.doFilter(requestWrapper, response);

    }

    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }
}

/*
 * 1.实现与被增强对象相同的接口2.定义一个变量记住被增强对象3.定义一个构造器,接收被增强对象
 * 4.覆盖需要增强的方法 5.对于不想增强的方法,直接调用被增强对象(目标对象)的方法
 */
// 包装类
class MyCharacterEncodingRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;

    // 接受被增强对象
    public MyCharacterEncodingRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    @Override
    public String getParameter(String name) {

        try {
            // 客户机提交的值
            String value = this.request.getParameter(name);
            if (value == null) {
                return null;
            }
            // 判断客户机的提交方式是不是get。这里忽略了get和GET方式
            if (!this.request.getMethod().equalsIgnoreCase("get")) {
                return value;
            }

            //客户机的原始码表
            value = new String(value.getBytes("ISO8859-1"),
                    this.request.getCharacterEncoding()); //获取上面的request设定的编码
            return value;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

2.前端页面接收中文乱码

    response.setContentType("text/html;charset=UTF-8");

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值