Http请求参数编码问题

本文探讨了Http请求参数编码遇到的问题,包括页面源码样式与Servlet响应的不一致。分析了问题原因,并提出了三种解决方案:手动解码、修改代码以及通过配置文件设置URIEncoding。手动解码适用于POST和GET请求,而修改配置文件的方法并不推荐。注意解码代码应在方法执行的开始位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Http请求参数编码问题:
1、问题:
1)页面源码,样式:

2)servlet代码,结果:

3)问题分析:

4)解决问题:
方式一:手动解码:
String name = new String(name.getBytes("iso-8859-1"),"utf-8");

问题处理:

方式二:request.setCharacterEncoding("utf-8");
方式三:通过修改配置文件的方式(但是不建议):
tomcat目录下–>conf–>server.xml–>在修改端口号的位置处最后添加一段代码:……URIEncoding=”utf-8”/>
5)方式一方式二整合代码:

package sram.request;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FifthRequest extends HttpServlet {
    //统一方便地获取请求参数的方法
    public void doGet(HttpServletRequest request, HttpServletResponse 
            response)throws ServletException, IOException {
        /**
         * 设置参数查询的编码
         * 该方法只能对请求实体内容的数据编码起作用。POST提交的数据在实体内容中,所以该方法对POST方法有效!
         * GET方法的参数放在URI后面,所以对GET方式无效!!!
         */
        request.setCharacterEncoding("utf-8");
        //获得所有参数的名字
        Enumeration<String> enums = request.getParameterNames();
        while(enums.hasMoreElements()){
            String paramName = enums.nextElement();
            if("hobit".equals(paramName)){
            //注意:paramName=="hobit"
                /**
                 * getParameterValues(name): 根据参数名获取参数值(可以获取多个值的同名参数)
                 */
                String[] value = request.getParameterValues("hobit");
                System.out.print("hobit:");
                for(String h:value){
                    if("GET".equals(request.getMethod())){
                        //手动重新解码(iso-8859-1 字符串-> utf-8 字符串)
                        h = new String(h.getBytes("iso-8859-1"),"utf-8");
                    }
                    System.out.print(h+",");
                }
                System.out.println();
            }else{
                String value = request.getParameter(paramName);
                if("GET".equals(request.getMethod())){
                    //手动重新解码(iso-8859-1 字符串-> utf-8 字符串)
                    value = new String(value.getBytes("iso-8859-1"),"utf-8");
                }
                System.out.println(paramName+":"+value);
            }
        }
    }
    //由于doGet()中获取参数的方式通用,所以只要调用doGet()方式即可
    protected void doPost(HttpServletRequest request, HttpServletResponse
            response)throws ServletException, IOException {
        this.doGet(request, response);
    }
}

注意事项:
1、手动解码:String name = new String(name.getBytes("iso-8859-1"),"utf-8");这种方式post、get均可使用。
2、request.setCharacterEncoding("utf-8");post专用,get用不了。
3、request.setCharacterEncoding("utf-8");如果使用这段代码建议放在方法的第一行。
4、if("hobit".equals(paramName)){//错误形式:paramName=="hobit"注意这段代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值