Http协议、request、response学习

目录

1.Http协议

1.1.协议介绍

1.2.HTTP协议中的请求格式(方向:浏览器 --> 服务器)

1.3.HTTP协议中的响应格式(服务器 --> 浏览器)

2.请求和响应原理图

3.request对象介绍(浏览器 ===> 服务器)

3.1.request获得请求行信息和ip地址

3.2.request获取头信息

3.3.获取请求参数

3.4.请求request参数乱码处理

3.4.1.乱码产生的原因

3.4.2.Get提交的中文乱码解决

3.4.3.Post提交的中文乱码解决

3.4.5.总结:

3.5.request域对象和请求转发

3.6.利用Referer(来源) 请求头防止“盗链”

4. response介绍(服务器 —> 客户端)

4.1.response的状态码和响应头设置

4.2.response请求重定向(头信息设置)

4.3.请求转发和重定向的区别:

4.4.网页定时刷新并跳转

4.5.设置响应体


 

1.Http协议

1.1.协议介绍

协议:是通信双方应该遵守的一个共同的规则。只有双方按照指定的规则,一方发送数据,另外一方才能接受到数据

UDP、TCP都是传输层的协议,而Http、files等是应用层协议,针对的是应用程序。

在互联网中,我们通过浏览器访问其他的网站,默认都会使用http协议。客户端和服务器之间进行交互的规则。

 

html:超文本标记语言

http协议:超文本传输协议HTTPHyperText Transfer Protocol)互联网上应用最为广泛的一种网络协议

设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。它是互联网交互的一种规则。

 

http协议的特点:

1.默认端口号是80,如果端口号是80可以忽略不写

2.http协议永远是客户端(浏览器或者手机等)发送请求,服务器回送响应

  (客户端访问服务端称为客户端的请求,服务器给浏览器回送数据称为服务器的响应)

3.http协议是基于TCP协议,基于应用层

 

1.2.HTTP协议中的请求格式(方向:浏览器 --> 服务器)

常见的get请求方式:1.地址栏直接输入   2.form表单get请求  3超链接

常见的post请求方式:form表单post请求

Http协议的请求格式:1.请求行   2.请求头   3.请求体

 

 

get请求和post请求的区别:

1.get请求没有请求体,post请求有请求体

2.get请求的请求信息都在url地址栏中,用户可见,信息不安全,而post请求的请求信息在请求体中,用户不可见,信息安全。

3.get请求的请求信息长度有限制,而post请求的请求信息对于长度没有限制。

 

1)请求行分成三部分:

1.客户端请求服务器时使用的请求方式:GETPOST

2.客户端请求服务器的资源路径:/day10/request 1

3.请求时客户端使用的协议:http/1.1

http1.0的明显缺陷:浏览器和服务器建立连接后,每次只能处理一次请求。

为了克服上述1.0的缺陷,http1.1 应运而生。它支持持久连接,也就是说在一个TCP连接上可以传送多个http请求和响应,从而减少建立和关闭连接的消耗延时。

 

2)请求头

它是有keyvalue组成的数据,keyvalue之间必须使用冒号隔开。一个key可以对应多个value值。

Accept: text/html,image/*   客户端识别文件类型

Accept-Charset: ISO-8859-1   客户端字符集

Accept-Encoding: gzip       客户端支持编码类型 gzip 压缩格式

Accept-Language:zh-cn        客户端语言

Host: www.itcast.com:80      访问服务器地址

If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT和Last-Modified 一起使用 控制缓存 (tomcat 提供缓存  过滤器 缓存处理)

Referer: http://www.itcast.com/index.jsp (重要) 防止盗链 获取网站域名地址  

User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 浏览器类型(文件下载时,不同浏览器进行不同处理)  不同的浏览器器存在兼容性!!

Connection: close/Keep-Alive         请求后连接是关闭还是保持

Date: Tue, 11 Jul 2000 18:23:51 GMT   请求时间

 

3)请求体

在请求中,只有post请求方式,才会有请求体,存放的是请求参数信息。

get方式的请求,请求数据中是没有请求体的。请求信息在url地址栏中。

 

 

1.3.HTTP协议中的响应格式(服务器 --> 浏览器)

http协议中在定义响应格式:分成3部分:1.响应行    2.响应头    3.响应体

1)响应行分成两部分:

http/1.1 表示http协议和版本

200 OK: 状态码  状态信息

 

常见状态码:

200 - 请求成功

302 – 请求重定向

404 - 请求的资源(网页等)不存在 (请求的url找不到具体的资源,例如找不到servlet,或者html,如果遇到404的错误,通常检查url是否写错,或者url-patten 是否配置错。)

500 - 内部服务器错误(如果遇到500的情况,表示的是java代码出错误)

状态码分类:

详细状态码:

 

2)响应头

Location: http://www.it315.org/index.jsp 通常告知浏览器马上向该地址发送请求,通常和302一起使用 ! 结合302完成重定向操作 Location重定向后地址(重点)
Server:apache tomcat    服务器类型
Content-Encoding: gzip  响应编码类型 gzip压缩
Content-Length: 800     响应体的长度
Content-Language: zh-cn 响应语言
Content-Type: text/html; charset=GB2312   响应字符集,决定浏览器打开文件格式类型 以及编码
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT 和If-Modified-Since 一起使用,实现服务器缓存策略
Refresh: 3;url=http://www.jd.com (页面自动刷新)3表示是的时间,3秒,Url表示跳转的地址,效果:到3秒后,页面刷新url

 

3)响应体

服务器输出给浏览器显示的内容.

http协议:超文本传输协议。http协议它是基于请求和响应而设计的协议。

请求和响应模型:一次请求,必然会有一次响应。它们是一一对应的。没有请求,不会有响应。

 

 

2.请求和响应原理图

servlet的最主要的作用就是处理客户的请求,并向客户端做出响应。为此,针对servlet的每次请求,tomcat在调用doGet或者doPost方法之前,都会创建两个两个对象,分别是HttpServletRequestHttpServletResponse对象。

HttpServletRequest用于封装HTTP请求消息,简称request对象。HttpServletResponse用于封装HTTP的响应消息,简称response对象。

通过一张图来描述浏览器访问servlet的交互过程:

注意每个servlet都只会被创建一个实例对象.然而每次Http请求,服务器都会调用所请求的Servlet实例的doGet(request,response) 或者dopostrequest,response)方法,每次都会重新创建request对象和response对象。

 

 

3.request对象介绍(浏览器 ===> 服务器)

http协议是基于请求和响应设计的协议,我们在Servlet程序就可以获取用户的请求,以及给客户端响应数据。用户在每次请求Servlet的时候,都会去执行Servlet对象中的service方法。而在service方法上接收2个参数:service( ServletRequest  request  , ServletResponse  response),ServletRequest是处理用户的请求,用户请求的所有信息都在ServletRequest对象中封装着。ServletResponse 它是专门给用户响应数据的。

无论request 还是response 它们在设计的时候都是围绕http协议中规定的请求和响应的格式而设计的方法。

 

3.1.request获得请求行信息和ip地址

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获得请求的方式(get还是post)
		String method = request.getMethod();
		// 获得请求资源
		String uri = request.getRequestURI();
		// 获得协议类型
		String protocol = request.getProtocol();
		// 获得IP地址
		String ip = request.getRemoteAddr();
		// 获得端口号
		int port = request.getLocalPort();
	}

 

获取请求的路径:访问服务器中的地址(即访问服务器中的项目和servlet地址)

URL:http://localhost:8080/day10/request1         

URI:/day10/request1

uri: 统一资源标识符,用来标识一个资源,资源路径

url: 统一资源定位符,是一种具体的URI,可以用来标识一个资源.并且指明了如何定位一个资源.

uri的表示范围 > url. url 是一种特殊的uri, url相当于是uri的子类.

 

3.2.request获取头信息

 

3.3.获取请求参数

用户请求参数的格式:key=value&key=value

 

3.4.请求request参数乱码处理

3.4.1.乱码产生的原因

 

3.4.2.Get提交的中文乱码解决

1)解决方案1:修改tomcat默认的编码方式(不推荐)

2)解决方案2:先编码再解码方式(推荐)

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取用户名
		String username = request.getParameter("username");

		// 方式一: 
		// 先使用 ISO-8859-1进行编码
		String encodeStr = URLEncoder.encode(username, "ISO-8859-1");
		// 再使用 UTF-8 进行解码
		username = URLDecoder.decode(encodeStr, "UTF-8");
		
		
        // 方式二: 
        // 先使用 ISO-8859-1进行编码
		byte[] bytes = username.getBytes("ISO-8859-1");
        // 再使用 UTF-8 进行解码
		username = new String(bytes, "UTF-8");
        // 链式方程(推荐)
		username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
		System.out.println("22后:" + username);
	}

 

 

3.4.3.Post提交的中文乱码解决

1)解决方案1:先编码再解码方式(不推荐)

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 方式一: 先编码,在解码
		String username = request.getParameter("username");
		username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
		System.out.println("post 用户名:" + username);
	}

2)解决方案2:设置请求编码(推荐)

这种方式只对 请求体 有效,所以只能处理post请求,get请求没有请求体。

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 方式二: 设置请求编码集(推荐)
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");
		System.out.println("post2 用户名:" + username);
	}

 

3.4.5.总结:

request乱码的解决方式:

request乱码解释:就是从浏览器提交到服务器的数据,在服务器看到的数据是乱码的

request乱码原因:浏览器编码为utf—8,服务器解码为IOS-8859-1,编解码表不同则乱码

推荐解决get提交的乱码的方式:

先编码再解码:username = new String(username.getBytes("ISO-8859-1"), "UTF-8");

推荐解决post提交的乱码的方式:

设置请求编码集:request.setCharacterEncoding("UTF-8");

 

response乱码的解决方式:

response乱码解释:就是从服务器响应到到浏览器的数据,在浏览器看到的数据是乱码的

request乱码原因:服务器编码为IOS-8859-1,浏览器解码为utf—8,编解码表不同则乱码

解决乱码的方式:将

response.setContentType("text/html;charset=utf-8");

 

3.5.request域对象和请求转发

当一个Web资源收到客户端的请求后,如果希望服务器通知另外一个资源处理.可以通过转发对象RequestDispatcher对象的forwardrequest,response)方法,将当前请求传递给其他的Web资源进行处理,这种方式称为请求转发

当客户端访问servlet1时,可以通过forward() 方法将请求转发给其他的web资源,其他的web资源处理完业务后,直接将响应的结果返回到了客户端。

在这些转发的过程中,所有的Servlet共享同一个请求对象。在转发中,客户端是感觉不要服务器内部在跳转。而且客户端的浏览器的地址栏中是不会发生任何变化的。

因为在多个Servlet中可以进行转发,导致多个Servlet之间共享同一个request对象,于是在发出转发的Servlet中,可以把request对象当做一个容器,然后给其中保存数据,在其他的Servlet中可以取出前面的Servletrequest对象中保存的数据。

request对象如果当做容器的话,它只是在当前这次请求中有效。当请求响应结束了,这个容器就消失了。

一次请求,会生成一个request对象,一次响应,会生成一个response对象,一次请求对应一次响应。

转发使用场景:最常用的转发,后期开发中,用户的提交数据一般交给Servlet处理,而Servlet把数据处理完成之后,在Servlet中转发的JSP页面上,由JSP页面负责数据的显示。 浏览器提交信息到服务器,web层中的servlet负责处理业务逻辑,从dao层获取数据,然后再请求转发给jsp,jsp负责页面展示;也就是说,将servlet处理的数据,转发到jsp上显示,就是一次请求转发,因为jsp的本质就是servlet。

 

请求转发代码:

request.getRequestDispatcher(url).forward(request, response);

注意:

  1. 请求转发是在同一个项目中转发
  2. 转发到的url不需要加项目名
  3. 转发共用一个request对象

 

3.6.利用Referer(来源) 请求头防止“盗链”

在实际开发中,经常会使用referer头字段,例如,一些站点为了吸引人气并提高站点访问量,提供了各种软件的下载界面,但是他们本身没有这些资源,只是将下载的超链接指向其他站点上的资源。而真正提供了载资源的站点为了防止这种“盗链”,就需要检查请求来源,只接受本站连接发送的下载请求,阻止其他站点连接的下载请求。

 

 

4. response介绍(服务器 —> 客户端)

response是专门针对客户端的请求,服务器给出响应。response是专门给客户端响应数据的响应对象。

http协议规定:响应数据也要分成三部分:

响应行:主要学习设置状态码

响应头:主要学习重定向

响应体:主要是给客户端响应页面上要展示的数据(验证码)

 

4.1.response的状态码和响应头设置

 

4.2.response请求重定向(头信息设置)

 

重定向:首先必须是客户端先发出请求,服务器告诉客户端继续访问其他的资源。

重定向的位置可以是任何资源(可以是本项目中的资源,也可以是其他地方的资源)。

重定向操作步骤:

1、设置状态码

2、设置头信息 location

重定向代码:

response.sendRedirect(url);

注意:

  1. 重定向可以在不同项目间跳转
  2. Url要写网络绝对路径

 

4.3.请求转发和重定向的区别:

 

请求转发代码:

request.getRequestDispatcher(url).forward(request, response);

注意:

1.请求转发是在同一个项目中转发

2.转发到的url不需要加项目名,比如 /servlet1,表示转发到本项目的servlet1

 

重定向代码:

response.sendRedirect(url);

注意:

1.重定向可以在不同项目间跳转

2.Url要写网络绝对路径,

比如http://localhost/day09/welcome.html,如果是本机的某个项目  /day10/servlet1

 

4.4.网页定时刷新并跳转

应用场景:经常网页中看到页面多少秒后的自动跳转例如你点击一个页面提示您访问的页面不存在, 5秒后返回首页.

通过设置refresh响应头信息来完成这个功能.格式: response.setHeader(“refresh,秒数;网址);

举例: response.setHeader(refresh,5;http://www.baidu.com)  表示5秒后跳转到百度首页

 

4.5.设置响应体

应用场景: 浏览器显示的内容下载文件等.

response 以流的形式,将内容输出给浏览器,response.getWriter() 获取响应体的字符输出流,response.getOutputStream() 获取响应体的字节输出流,通过这两个流可以向浏览器输出响应体内容.

 

注意问题:

1 文件复制时: getOutputStream    手动生成响应内容时使用getWriter

2 getOutputStream 和 getWriter 相互排斥,不能同时使用,否则会冲突.

3 tomcat会自动调用response输出流的 close方法和flush方法因此不需要我们手动关闭流.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值