先看一个
post方式
登录的例子:
请求头
Host: www.xxx.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.xxx.com/Login
Cookie: POP800_VISIT_TIMES=2; PAGE_VIEW_TIMES=2; POP800_VISITOR_ID_L=1C16FEC2D3987BC1AB9B831C81837971; JSESSIONID=45293BBF138D17AFF0A7B4C7633B8443
Connection: keep-alive
请求主体
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
userName=admin&userPswd=123456
用
get方式
查询字符串
username=tom
userpswd=123456
请求头
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: JSESSIONID=316D88065AD990F7BEB4AEEB00A1E27B
Connection: keep-alive
get方式的请求主体为空
以上是用火狐浏览器获取到的数据
------------------------------------------------------------------------------------------------------------------------
可以用这种方式模拟一下get请求:
telnet localhost 80
GET /javaweb_interview/lesson13/get.jsp?username=tom&userpswd=123456 HTTP/1.1
Host:localhost
两次回车
---------------------------------------------------------------------------------------------------------------------------
好,下面我们来总结一下。。。
http协议是一种基于请求、响应模式的,无状态协议
http1.0:
1、客户端发起连接
2、客户端发起表求
3、服务器端响应请求
4、服务器端关闭连接
在http1.1中,给出了一个持续连接机制,浏览器建立一个连接之后,发送请求并得到回应,然后持续发送请求并得到回应。
比如一个有三张图片的页面,客户端发起连接和请求,先得到这个页面,然后得到了三张图片的URL,于是在不断开连接的情况下,再次发起请求,分别得到这三张图片。
然后客户端发起关闭连接的请求,服务器关闭连接。
http请求由三部份组成:
请求行、消息报头、请求正文
请求行:以一个方法符号开头,后面跟着请求URL和协议版本,以CRLF结尾
一个请求行例子:GET index.html HTTP/1.1 (CRLF)
POST方法要求服务器接受附在后面的数据
POST login.jsp HTTP/1.1 (CRLF)
Accept:image/gif (CRLF)
...
username=tom&password=aaaaaa
HEAD方法和GET方法基本一样,只不过它只请求消息报头,而不是完整内容
在http协议中,方法只能大写
http响应与请求相似,也是由三个部份组成的:
状态行、消息报头、正文
比如我们再来用163网站测试一下get请求
telnet www.163.com 80(默认23端口)
GET /index.html HTTP/1.1
Host:www.163.com (两次回车)
get和post的区别?
get方式:将所有参数附加在
请求行的URL的后面一起传递
post方式:将所有参数附加在
请求主体的最后一行的下一行的下一行
在servlet中,采用doGet()和doPost()分别来处理这两种方式,任何一个请求都会先进入service()方法,然后再判断进入doGet()还是doPost(),这是servlet默认的service()方法。当然,我们可以覆盖service(),重写它的代码。
重定向与转发
response.sendRedirect("out.jsp?name=tom&age=25");//这是一个响应命令,要求客户端去访问这个页面
<%=request.getAttribute("name") %> 空
<%=request.getParameter("age") %>
request.setAttribute("name","tom");//转发是request对象在操作
request.getRequestDispatcher("out.jsp?age=22").forward(request,response);
<%=request.getAttribute("name") %>
<%=request.getParameter("age") %>
假设A是客户端,访问B页面,再到C页面
如果是转发,则是A到B,再由B到C,而如果是重定向,则是A到B,B告诉A应该去访问C,于是A又去访问C:
A-B-C 转发
A-B A-C 重定向
也就是说,请求转发始终是一个请求一个响应,始终是一个request,一个response在流转;重定向是两个请求两个响应,两个请求之间没有任何关系。
所以,转发时,浏览器地址栏永远是B,因为客户端不知道B页面干了什么
而重定向时,由于服务器通知了客户端去访问C ,所以浏览器地址显示的是C