解决全站字符乱码(POST和GET中文编码问题)

简介: 乱码问题:获取请求参数中的乱码问题;  POST请求:request.setCharacterEncoding(“utf-8”);GET请求:newString(request.getParameter(“xxx”).getBytes(“iso-8859-1”), “utf-8”);响应的乱码问题:response.setContextType(“text/html;charset=


乱码问题:

获取请求参数中的乱码问题;

  POST请求:request.setCharacterEncoding(“utf-8”)

GET请求:newString(request.getParameter(“xxx”).getBytes(“iso-8859-1”), “utf-8”)

响应的乱码问题:response.setContextType(“text/html;charset=utf-8”)

 

  基本上在每个Servlet中都要处理乱码问题,所以应该把这个工作放到过滤器中来完成。

package cn.itcast.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class EncodingFilter implements Filter {
    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 处理post请求编码问题,只对post请求起作用
        request.setCharacterEncoding("utf-8");
        
        HttpServletRequest req = (HttpServletRequest) request;
        

        
        /*
         * 调包request
         * 1. 写一个request的装饰类
         * 2. 在放行时,使用我们自己的request
         */
        if(req.getMethod().equals("GET")) {
            EncodingRequest er = new EncodingRequest(req);//调包request
            chain.doFilter(er, response);
        } else if(req.getMethod().equals("POST")) {
            chain.doFilter(request, response);
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {

    }
}



装饰者模式实现增强的request类 ,覆写getParameter方法

package cn.itcast.web.filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * 装饰reqeust
 * @author cxf
 *
 */
public class EncodingRequest extends HttpServletRequestWrapper {
    private HttpServletRequest req;
    
    public EncodingRequest(HttpServletRequest request) {
        super(request);
        this.req = request;
    }

    public String getParameter(String name) {
        String value = req.getParameter(name);
        
        // 处理编码问题
        try {
            value = new String(value.getBytes("iso-8859-1"), "utf-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        
        return value;
    }
}

 一般如果method设置为“post”,将不会出现乱码,如果将method设置为“get”,可能在汉字传入到后台后会出现乱码问题。



get方式传递中文参数乱码后台可以

将请求参数使用ISO-8859-1分解成字节数组,再将字节数组解码成字符串

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8");

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1677824

目录
相关文章
|
4月前
|
存储 Web App开发 JavaScript
Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码
Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码
320 0
|
9月前
|
数据采集 Python
【Python爬虫】用urllib请求一个网页,响应的content中中文为16进制,如何转换为中文
用urllib请求一个网页,响应的content中中文为16进制,如何转换为中文
C++ 过滤出字符串的中文(GBK,UTF-8)
C++ 过滤出字符串的中文(GBK,UTF-8)最近在处理游戏敏感词之类的东西,为了加强屏蔽处理,所以需要过滤掉字符串中的除汉字之外的是其他东西如数字,符号,英文字母等。 首先我查阅资料并写了个函数: 示例:返回输入字符串中汉字的个数: 复制代码std::string StrWithOutSymb...
4589 0
url参数+,&,=,/等转义编码
  url出现了有+,空格,/,?,%,#,&,= 等特殊符号的时候,可能在服务器端无法获得正确的参数值。 案例:   如果我们想让barcodevalue的参数是http://www.baidu.
6321 0
|
存储 安全 关系型数据库
为什么编码不同会出现乱码?
本章节通过情景模拟,和大家一起探讨为什么编码不同会出现乱码
|
资源调度 uml
HTML特殊字符编码对照表
HTML特殊字符编码对照表 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 Α Α Α Β Β Β Γ Γ Γ Δ Δ Δ Ε Ε Ε.
1182 0