前言:
做Web开发就一定会涉及到浏览器和服务器的交互,所以了解浏览器和服务器交互的方式就尤为重要。从接触B/S开始就已经接触到了get和post
HTTP协议
说道GET和POST,就不得不提HTTP协议,因为浏览器和服务器的交互是通过HTTP协议执行的,而GET和POST也是HTTP协议中的两种方法。
HTTP全称为Hyper Text Transfer Protocol,中文翻译为超文本传输协议,目的是保证浏览器与服务器之间的通信。HTTP的工作方式是客户端与服务器之间的请求-应答协议。get方式:
1)提交的参数信息会出现在请求行url的后面,参数信息和url是以?分开,参数名称与参数值“=”连接,参数之间用&分隔开。
2)不适合敏感数据的提交
3)URL编码格式采用的是ASCII编码,而不是Unicode,即所有的非ASCII字符都要编码之后再传输。
4)因为URL的长度限制,GET方式传输的数据大小有所限制,传送的数据量不超过2KB。
5)GET方式服务器端用Request.getQueryString()获取变量的值
6)GET方式传输的参数安全性低,因为传输的数据会显示在请求的URL中
7)GET请求能够被缓存
8) get请求会保存在浏览器浏览记录中
post方式:
1)实体内容(uri后面的内容)在post中,适合敏感数据的提交
2)POST方式将表单内各个字段和内容放置在HTML HEADER中一起传送到Action属性所指定的URL地址,用户是看不到这个过程的。
3)POST方式传送的数据量比较大,一般被默认为没有限制,但是根据IIS的配置,传输量也是不同的。
4)POST方式传输的数据安全性较高,因为数据传输不是明显显示的。
5)POST请求不能被缓存下来
6) POST请求不会保存在浏览器浏览记录中
7)GET在浏览器回退时是无害的,POST会再次提交请求。
总结:
POST和GET方式的安全性是相对的,另外也要看是从哪个角度来看的。从数据传输过程方面来看,POST方式是更加安全的,但是从对服务器数据的操作来看,POST方式的安全性又是比较低的。即使是传输过程用POST来执行,安全性也是相对的,如果了解HTTP协议漏洞,通过拦截发送的数据包,同样可以修改交互数据,所以这里的安全不是绝对的。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
获取参数数据的小例子
package b_servlet;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
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("/RequestDemo4")
public class RequestDemo4 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*String value = request.getParameter("username");
System.out.println(value);
String password = request.getParameter("password");
System.out.println(password);
System.out.println("-----------");
Enumeration<String> enums = request.getParameterNames();
while(enums.hasMoreElements()){
String paraName = enums.nextElement();
//再根据参数名称获取参数值
String paraValue = request.getParameter(paraName);
System.out.println(paraName+"="+paraValue);
}
System.out.println("---------------");*/
Map<String, String[]> map = request.getParameterMap();
//遍历,获取所有的键
Set<String> keySet =map.keySet();
//通过键获取值
for(String key:keySet){
String[] values = map.get(key);
System.out.println(key+"="+values[0]);
System.out.println("---------");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}