Request

01_http协议

1_1_http协议的基本概念

协议:提前做出的一些约定

网络协议:约定数据在网络中传输格式 QQ 发送邮件

HTTP协议:约定通过客户端的浏览器和服务端进行传输数据约定

1_1_1_http协议的简介

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

所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext,这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1

1_1_2_http协议的作用

互联网的数据传输底层依赖tcp协议,http协议架构在tcp协议之上,

它规范了传输数据的内容和格式

1_3_请求信息的组成部分

学习http请求信息的组成,我们的目的是,了解浏览器将那些数据,按照什么样的格式发送给服务器

http请求一共分为三个部分:请求行,请求头,请求体.

get  /day28_001/XX.html?name=tom&age=18   http/1.1

key1:value1

key2:value2

key3:value3

key4:value4

 

post  /day28_001/XX.html http/1.1

key1:value1

key2:value2

key3:value3

key4:value4

 

name=tom&age=18&sex=nan

1_3_3_请求行

1_请求行介绍       

请求方式  请求路径  协议/版本

请求行:  POST /day02/1.html HTTP/1.1

POST         请求方式

/day02/1.html  访问路径

HTTP/1.1      http协议的版本


getpost请求方式的区别?

数据量/安全/数据提交方式 

Get /day28_001/demo01?name=tom&age=1888888888888888 http/1.1

数据量: GET方式受到地址栏限制,POST数据没有受到限制

安全:get不安全  post:相对安全

数据提交方式 : get接在请求行路径之后  post在请求体部分传递

 

1_3_4_请求头

1_请求头内容 

Host: localhost:8080

(服务器的域名)

Connection: keep-alive

(网络连接是持久的)

Content-Length: 12    

(发送数据的大小,单位字节)

Cache-Control: max-age=0 

(设置缓存数据的存活时间,单位秒)

Origin: http://localhost:9090

(指示了请求来自于哪个站点——服务器名称)

Upgrade-Insecure-Requests: 1 

(如果存在更安全的响应,客户端优先选择加密及带有身份验证的响应)

Content-Type: application/x-www-form-urlencoded

(发送数据的媒体类型——发挥作用类似后缀名:.mp3 .avi)

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

(当前系统和浏览器版本)

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Referer: http://localhost:9090/day01/1.html

Accept-Encoding: gzip, deflate, br

Accept-Language: zh-CN,zh;q=0.9

Cookie: JSESSIONID=98006861B5044ACC8D5C7840C93C17DA

1_3_5_请求体

通过表单向服务端发起请求,而且form表单method的取值为post的时候,发的是post请求

其他都是GET

1_ 请求体内容:

   注意:  get请求没有请求体, post请求有请求体

02_request对象获取请求信息

服务端通过输入流读取到本次请求的所有请求部分的HTTP协议数据,对HTTP协议的请求部分进行解析,将其中的数据拆分打乱,将其封装到一个叫做request的对象上,此时还可以创建一个response对象.

2_1_request对象的基本概念

1_  什么是HttpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

HttpServletReuqest不是相关请求的顶级接口,它继承自父接口——ServletRequest

通过Request对象进行的常用操作:

*_获取客户机信息

*_获取请求行

*_获取请求头信息

*_获取请求参数( 请求体)

*_利用请求域传递对象

2_2_request获取请求行信息

2_2_1_请求行的组成元素(通过request获取请求行数据)

      http协议中我已经看到了http协议中请求行的内容——分为请求方式、请求路径、协议版本。在HttpServletRequest概述中浏览器与请求相关的数据封装在request

get /day28_001/demo http/1.1

2_2_2_API介绍

String getMethod()              获取请求方式的类型

String getRequestURI()       获取请求行中的资源名部分

StringBuffer getRequestURL()  获取客户端发出请求完整URL

uri: 统一资源标识符,用来标识一个资源,资源路径。(相当于身份证)

url: 统一资源定位符,是一种具体的URI,可以用来标识一个资源.

并且指明了如何定位一个资源.(相当于身份证中的地址)

String getProtocol()         获取当前协议的名称和版本

String getRemoteAddr()       获取IP地址

int getLocalPort()             获取端口

2_3_request获取请求头信息

2_3_1_获取请求头信息常用的方法

2_3_1_1_API介绍

String getHeader(String name)   String 的形式返回指定请求头的值

e.g:

String header = request.getHeader("User-Agent");

              System.out.println("getHeader:"+header);

Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举

e.g:

Enumeration<String> headerNames = request.getHeaderNames();

              while (headerNames.hasMoreElements()){

                     System.out.println("getHeaderNames:"+headerNames.nextElement());

              }

使用referer实现防盗链

/*
* 使用referer实现防盗链
* 用户->download.jsp->DownloadServlet
*/
@WebServlet(name = "DownloadServlet",urlPatterns = "/DownloadServlet")
public class DownloadServlet extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          this.doGet(request,response);
   }
 
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //处理响应中文乱码 
              response.setContentType("text/html;charset=UTF-8");
              //获取输出流  
          PrintWriter writer = response.getWriter();
 
          //获取请求头referer
          String referer = request.getHeader("referer");
          //如果请求头referer存在,且请求来源于正规服务器的download.jsp页面的话
          if(referer != null && referer.equals("http://127.0.0.1:8080/chenqi/download.jsp")){
                 //没有盗链,在浏览器中显示可以下载
                 writer.write("可以下载");
          }else{
                 //请求来源于盗链者服务器的download.jsp页面的话
                 writer.write("这是盗链,不可以下载");
          }
          writer.flush();
          writer.close();
   }
}

2_4_获取请求参数

API介绍

String getParameter(String name)  根据表单的name属性 获取对应的值

String[] getParameterValues(String name)  获取name相同的所有value 例如复选框。

Map getParameterMap()  参数名作为key,参数值作为value,封装到map

2_4_2_乱码解决

void setCharacterEncoding(String env)

设置请求体的编码

//处理post请求乱码

              request.setCharacterEncoding("utf-8");

              String username = request.getParameter("username");

              System.out.println(username);

2_5_request的其他作用

2_5_1 获取项目路径

String getContextPath()  获取项目路径

2_5_2_域对象

_什么是域对象?

request上应该有一些map , 分别封装HTTP协议请求部分的数据.

1_将请求头的数据封装在map

2_将请求参数(从客户端提交到服务端键值对)的数据封装在map parameterMap

3_request上还有一个空map.  attributes ,存放程序运行过程中产生数据。(域对象)

_域对象是一个容器,这种容器主要用于servletservlet之间的数据传输使用的 .

request域对象,就可以在一次请求中的多个servlet之间进行数据共享.

2_5_2_1_域对象的API介绍

void setAttribute(String name, Object o)  设置数据到域中

Object getAttribute(String name)  从域中获取数据

void removeAttribute(String name)  从域中移除数据

2_5_2_2_request域对象的使用

1_ 创建ScopeServlet

2_ 调用request对象存(setAttribute)取(getAttribute)删(removeAttribute)方法

3_ 在保存和删除方法调用完成之后,都是的获取方法获取数据,打印在控制台上

2_5_2_3_注意事项

以上三个方法都是操作request中域对象的数据,与请求参数无关。

2_5_3_请求转发

2_5_3_1_什么是请求转发?

当服务端有2个Servlet

Demo03Servlet,Demo04Servlet,我们从浏览器向服务端发起请求的时候,希望服务端做一件事情,但是将这件事情都在Demo03Servlet中实现不太合理,所以将这件事情在2个Servlet去实现。  Demo03Servlet完成这件事情的一部分操作,剩余部分交给Demo04Servlet来实现

在Demo03Servlet中完成代码之后,希望让Demo04Servlet去执行,

但是不能自己去new Servlet,利用请求转发实现对Demo04Servlet调用

request.getDispatcher(“”).forward();;

总结:

01_http协议

http请求行

http请求头

http请求体

http请求行

get   /chenqi/demo01      http/1.1

post  /chenqi/demo1.html  http/1.1

什么时候post?

   通过表单提交,而且<form method="post">

   其他都是get

   

get/post

数据量/是否安全/提交方式   

get   /day28_001/demo01?name=tom&age=18      http/1.1

post: 请求体

http请求头

k1:v1

k2:v2

k3:v3

k4:v4

k5:v5

空行

User-Agent:客户端操作系统的信息以及浏览器的信息

Referer: 当前请求是通过哪里过来的

http请求体

get方式没有请求体

post方式有请求体

name=tom&age=18&hobby=chouyan&hobby=hejiu

02_request

*_request什么时候创建?

  当服务端将HTTP协议请求部分获取到之后,进行解析,拆分打乱封装到request对象。

  同时创建reqponse.

*_request代表什么?

   代表从客户端到服务端发起请求这个过程

*_request能够做什么?

  #_request能够获取请求行

     api:

request.getMethod();

     request.getRquestURL();  

request.getRquestURI();  

request.getProtocal();

  #_request能够获取请求头

     request.getHeader("name");

Enumeration en=request.getHeaderNames();

  #_request能够获取请求体(客户端传递到服务端的参数)  Parameter:参数

     request.getParameter("name")

String[] arr=request.getParameterValues("name")

Map<String,String[]> map=request.getParameterMap()

  #_request能够获取客户端信息

     request.getRemoteAddr(); //IP ,通过socket

  #_请求转发

     请求头  表单参数 parameterMap  

空map attributes (存放程序运行过程中产生的数据):域对象

 

什么是请求转发?

怎么实现请求转发?

    request.getRequestDispatcher("/demo02").forWard(request,response);

发表评论