天天看点

Servlet中request请求Get和Post方法以及乱码解决

前言:

传递的请求参数如何获取

GET方式: 参数放在URI后面
 POST方式: 参数放在实体内容中           

后台获取前台数据方法:

获取GET方式参数:
request.getQueryString();
获取POST方式参数:
request.getInputStream();           

但是以上两种不通用,而且获取到的参数还需要进一步地解析。

request.getParameter

代替。

核心的API:
request.getParameter("参数名");  根据参数名获取参数值(注意,只能获取一个值的参数)
request.getParameterValue("参数名“);根据参数名获取参数值(可以获取多个值的参数)
request.getParameterNames();   获取所有参数名称列表  
request.setCharacterEncoding("utf-8");修改实体内容编码格式。           

注意:

request.setCharacterEncoding可以设置Response容器的实体内部  
编码格式,而对URL(GET)编码无效。先了解,下面会解释。           

Html前台form表单输入框:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/haha/dd" method="Get">
用户名:<input type="text" name="name" /><br/>
密码:<input type="password" name="password" /><br/>
性别:
<input type="radio" name="性别" value="男"/>男
<input type="radio" name="性别" value="女"/>女<br/>
爱好:<br/>
<input type="checkbox" name="喜好" value="篮球"/>篮球<br/>
<input type="checkbox" name="喜好" value="足球"/>足球<br/>
<input type="checkbox" name="喜好" value="月球"/>月球<br/>

隐藏域:<input type="hidden" name="hiden" value="001" /><br/>
籍贯:
<select name="jiguan">
    <option value="广东">广东</option>
    <option value="广西">广西</option>
    <option value="湖南">湖南</option>
 </select>
<br/>
个人简介:
<textarea rows="5" cols="10" name="area"></textarea><br/>
<input type="submit" value="提交"/>
</form>
******************************************************************************
<form action="/haha/dd" method="Post">
用户名:<input type="text" name="name" /><br/>
密码:<input type="password" name="password" /><br/>
性别:
<input type="radio" name="性别" value="男"/>男
<input type="radio" name="性别" value="女"/>女<br/>
爱好:
<input type="checkbox" name="喜好" value="篮球"/>篮球<br/>
<input type="checkbox" name="喜好" value="足球"/>足球<br/>
<input type="checkbox" name="喜好" value="月球"/>月球<br/>

隐藏域:<input type="hidden" name="hiden" value="002" /><br/>
籍贯:
<select name="jiguan">
    <option value="广东">广东</option>
    <option value="广西">广西</option>
    <option value="湖南">湖南</option>
 </select>
<br/>
个人简介:
<textarea rows="5" cols="10" name="area"></textarea><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>           

servlet后台接受:

package a;

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

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

@WebServlet("/dd")
public class dd extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(request.getMethod());
        Enumeration<String> enumeration=request.getParameterNames();
        while(enumeration.hasMoreElements()) {
            String name=enumeration.nextElement();
            if("喜好".equals(name)) {
                String[] str=request.getParameterValues(name);
                System.out.println(name+": ");
                for(String string:str) {
                    System.out.println(string);
                }
            }else {
                System.out.println(name+": "+request.getParameter(name));
            }
        }
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        this.doGet(request,response);
    }
}
           

乱码问题:

request中,在servlet中调用Request的getParameter方法返回的  
是 字符串(“中国”),方法内部拿到数字后要转成字符,一定要查码表  
由于request的设计者是外国人,所以默认查的是他们常用的ISO8859-1  
这就是请求数据产生乱码的根源。           
  1. Tomcat8以上版本默认编码格式是

    UTF-8

  2. HttpServletRequest和HttpServletResponse容器默认编码格式是

    iso-8859-1

Get和Post解码格式:

request容器保存的是浏览器的数据,一般是UTF-8格式。

request的方法如:getParameter解码格式会根据Get和Post来设置解码格式。因为Get和Post的取值放在不同地方。所以要分开考虑。

1. Get是URL解码方式。默认解码格式是Tomcat8编码格式。所以URL解码是UTF-8,
覆盖掉了request容器解码格式
2. Post是实体内容解码方式。默认解码格式是request编码格式。与Tomcat8编码格式无关           

POST:

在测试中发现,tomcat服务器中Response容器默认以

ISO8859-1

的编码解析数据,因此如果需要在参数中解析中文,需要设置

request.setCharacterEncoding("utf-8");           

注意:要写在request.getParameter前面

  • 设置参数查询的编码
  • 该方法只能对Response容器的请求实体内容的数据编码起作用。POST提交的数据在实体内容中,所以该方法对POST方法有效!
  • GET方法的参数放在URI后面,所以对GET方式无效!!!

Get:

虽然 Response容器默认以

ISO8859-1

的编码解析数据

但是对于get请求提交的数据,在不同版本的tomcat中有不同的处理方式,在tomcat8及以上的版本,服务器默认以utf-8的编码方式处理请求参数

办法一:tomcat版本8以上不用指定编码格式,默认utf-8

而对于tomcat8以下的版本,服务器会默认以ISO8859-1的编码方式处理请求参数

方法二:编码二次转换 推荐

utf-8-》iso-8859-1》utf-8   原样
utf-8-》GBK-》utf-8         乱码           

具体可以参考这篇:

https://blog.csdn.net/qq_38409944/article/details/80637345

现在基本都是Tomcat8以上版本 ,所以不存在编码问题,而如果是Tomcat8以下版本解决方案:

手动解码:String name =   
new String(name.getBytes("iso-8859-1"),"utf-8");           

方法三:设置指定解码URL的编码格式:URIEncoding="UTF-8" 不推荐 依赖服务器,有时候没法设置服务器

另外,在tomcat目录下的/conf中的server.xml中我们也可以手动配置tomcat默认的编码方式,在 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>这段代码中添加一个URIEncoding参数,可以配置tomcat的默认编码方式。

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>           

但是不推荐。

方法四:请求参数的编码方式要采用请求体的编码方式 不推荐 依赖服务器,有时候没法设置服务器

useBodyEncodingForURI=true是说,。当useBodyEncodingForURI=true时,若请求体采用utf-8解析,则请求参数也要采用utf-8来解析。

server.html:
<Connector port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" useBodyEncodingForURI="true" />           
Servlet:
doGet(){
request.setCharacterEncoding("utf-8");
}           

分析:

request.setCharacterEncoding("utf-8");

只是作用于实体内部,意思就是说对Post有效,对Get无效。

但是设置

useBodyEncodingForURI="true"

后URL解码格式和实体内容解码格式一样。

注意:如果只是设置

useBodyEncodingForURI="true

那get URL解码格式就是默认

iso-8859-1

,因为实体内部默认是这个解码格式,即使Tomcat版本8以上默认编码格式为UTF-8也会被

iso-8859-1

覆盖掉。

总结:

  1. 中文建议post而不是get
  2. Tomcat8版本以上默认是UTF-8对GET方法来说,对POST无效,

    因为request.getParameter默认调用·iso-8859-1·

  3. get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value&parame2=value2的形式附加在URI字段之后。

    而Post是放在实体内部。

  4. 而request.setCharacterEncoding(charset);只对消息体中的数据起作用,对于URI字段中的参数不起作用。默认作用于POST,对POST无效。 当使用request.setCharacterEncoding(charset);时,只能解决表单方法为POST的中文乱码情况,而方法为GET的依然为乱码。
  5. request.setCharacterEncoding("UTF-8");
  6. useBodyEncodingForURI="true"目的是URL解码格式和实体内部解码格式相同。
  7. 如果使用JS编程时,在浏览器可以使用encodeURIComponent函数对中文参数进行编码后再拼装参数。

参考:

https://blog.csdn.net/sinat_26503455/article/details/53584139 https://www.cnblogs.com/keyi/p/6365649.html https://blog.csdn.net/hackersaillen/article/details/46965357

继续阅读