首先说一下Http协议

一.Http协议的概念及作用

1.什么是HTTP协议?

(HTTP,HyperText 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。

2.HTTP协议的作用

HTTP协议规范了传输信息的内容和格式

二..HTTP,查看浏览器的传输过程

1).启动浏览器;

   2).按F12,启动:调试模式,网络(NetWork)

   3).刷新网页,重新发送请求。

   4).可以查看请求信息:

三.HTTP协议_浏览器请求信息的组成

请求行

GET /资源路径 HTTP/1.1

请求头

请求头:一堆内容,作为了解即可

Host: localhost:9090 (服务器的域名)

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

3.请求体

如果提交方式为get,则没有内容

如果提交内容是post,则会存放提交内容的键值对形式

四.request对象的基本概念

request,在java中为HttpServletRequest对象

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

注:request对象封装了http请求中的所有信息,是由服务器创建

五.request对象_获取请求行信息

java中request对象的六个方法获取请求行的所有信息

获取提交方法(getMethod)

获取请求行中的资源路径(getRequestURI)

获取完整的请求URL(getRequestURL)

获取协议名称/版本(getProtocol)

获取IP地址(getRemoteAddr)

获取本地端口(getLocalPort)

代码:

  1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. // 获取提交方法(getMethod)
  3. System.out.println("请求行方法:"+req.getMethod());
  4.  
  5. // 获取请求行中的资源路径(getRequestURI)
  6. System.out.println("请求行资源路径:"+req.getRequestURI());
  7.  
  8. // 获取完整的请求URL(getRequestURL)
  9. System.out.println("完整的请求URL:"+req.getRequestURL());
  10.  
  11. // 获取协议名称/版本(getProtocol)
  12. System.out.println("获取协议,版本:"+req.getProtocol());
  13.  
  14. // 获取IP地址(getRemoteAddr)
  15. System.out.println("获取IP地址:"+req.getRemoteAddr());
  16.  
  17. // 获取本地端口(getLocalPort)
  18. System.out.println("获取本地端口:"+req.getLocalPort());
  19.  
  20. }

当有http请求时,会输出请求行信息

运行结果

六.request对象_请求头信息

两个方法

  1. String getHeader(String name);以String的形式返回指定name的值
  1. Enumeration getHeaderNames(),返回此请求包含的所有头名称的枚举

代码

  1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. //显示请求头信息
  3. System.out.println("通过头名称name查询指定信息");
  4. System.out.println("User-Agent"+req.getHeader("User-Agent"));
  5.  
  6. System.out.println("查询所有信息");
  7. Enumeration<String> hn = req.getHeaderNames();
  8. while(hn.hasMoreElements()){
  9. String str=hn.nextElement();
  10. System.out.println(str+req.getHeader(str));
  11. }
  12. }

七.request对象_请求头_通过referer实现防盗链

1.什么是盗链?

通过其他网站访问本网站的一些资源

2.如何防止盗链?

思路

通过网页发送的请求eg.download.jsp

如果download.jsp中的请求,来源于盗链者服务器,我们就显示不可以下载;

如果download.jsp中的请求,来源于正规服务器,我们就显示可以下载;

实现

通过referer获取请求头信息

String header=request.getHeader(“referer”);

  1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. String referer = req.getHeader("referer");
  3. System.out.println(referer);
  4. if(referer.startsWith("http://localhost:8080/zc/")||referer.startsWith("http://127.0.0.1:8080/zc/")){
  5. System.out.println("正常连接");
  6. }else{
  7. System.out.println("盗链连接");
  8. }
  9. }

盗链主要通过标红的地方判断

八.request对象_获取请求体

接下来说的是无论是get提交还是post提交,即无论请求体中有没有数据,都是可以使用的

1).public String getParameter(String key):获取某个键的值。

    2).public String[] getParameterValues(String key)获取一个键的多个值(复选框、多选下拉列表)

    3).public Map<String,String[]> getParameterMap();获取所有的键值对并封装到一个Map.

    4).public void setCharacterEncoding(String charsetName):设置request的解码方式如果参数中有中文

                                       需要使用:"UTF-8"。

  1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. //获取请求体信息
  3. System.out.println("获取请求体信息");
  4. String username = req.getParameter("username");
  5. String password = req.getParameter("password");
  6.  
  7. System.out.println("username:"+username);
  8. System.out.println("password:"+password);
  9.  
  10. System.out.println("-----------------------------------------------");
  11. //当一个name对应多个值时,例如复选框,下拉列表,使用getParameterValues
  12. String[] pv = req.getParameterValues("hobby");
  13. for (String s : pv) {
  14. System.out.println(s);
  15. }
  16.  
  17. System.out.println("-----------------------------------------------");
  18. //getParameterMap,获取所有的键值对,并封装到一个对象中
  19. Map<String, String[]> map = req.getParameterMap();
  20.  
  21. Set<String> strings = map.keySet();
  22. for (String string : strings) {
  23. System.out.println(string+" : "+map.get(string));
  24. }
  25.  
  26. }

九.request对象_BeanUtils工具类的使用

1.什么是"BeanUtils":它是一个第三方的软件包。

作用自动解析客户端的请求并根据一个Map自动封装JavaBean

2..使用步骤:

        1).将BeanUtils所需jar包复制到lib目录下,并关联到模块中。

        2).使用BeanUtils工具包:

1.    案例代码

  1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. User user=new User();
  3. //使用工具类
  4. try {
  5. BeanUtils.populate(user,req.getParameterMap());
  6. } catch (IllegalAccessException e) {
  7. e.printStackTrace();
  8. } catch (InvocationTargetException e) {
  9. e.printStackTrace();
  10. }
  11. System.out.println(user);
  12. }

十.request对象_请求转发

1).什么是请求转发:当前Servlet进行一部分处理,然后转发给另一个Servlet继续处理。

2).第一个Servlet,要转发给另一个Servlet,必须将request和response对象传给另一个Servlet。

语句:

request.getRequestDispatcher(“路径”).forward(request,response);

  1. req.getRequestDispatcher("路径").forward(req,resp);

十一.request对象_其它功能_域对象的概念

1).什么是域对象:是指可以在一定范围内可以共享数据的一种对象。

2).几个重要的域对象:

    1).request:可以在转发的所有路径上,共享同一个request对象。

    2).session:

    3).ServletContext:

十二.request对象的生命周期:

    1).客户端每次发送请求,Tomcat都会为本次请求创建一个新的Request对象;

    2).在Servlet的处理请求的service()方法执行过程中,一直存活。

                 如果被转发,此request会被传到另一个Servlet,继续存活;

    3).直到service()执行完毕,request对象立即被清理。

javaWeb_Request对象的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  3. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  4. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  5. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  6. Chrome出了个小bug:论如何在Chrome下劫持原生只读对象

    Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...

  7. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  8. ASP.NET内置对象的总结

    1. Response对象可形象的称之为响应对象,用于将数据从服务器发送回浏览器. 实例源码:链接: http://pan.baidu.com/s/1dDCKQ8x 密码: ihq0  2. Requ ...

  9. ADO.NET对象的详解

    1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...

随机推荐

  1. 电商技术中企业数据总线ESB和注册服务管理的区别

    一.概述 1.什么是ESB 就是企业数据总线的意思,他的核心功能就是兼容各种协议接口,可以将数据在各种协议之间进行流转,并且可以针对数据格式进行编排转换. 异构系统,功能繁多,复杂 代表性的项目有:J ...

  2. ios 自定义RadioButton

    1 前言 众所周知在IOS中没有单选按钮这一控件,今天我们来学习一下简单的单选控件.类似与Web中的radio表单元素. 2 详述 本控件单纯的利用按钮控件和NSObject的respondsToSe ...

  3. ZJOI2018游记Round2

    Day0 趁着空档还溜回班上了一节物理课:瓢泼之中在9:00赶往余姚,车程3h+-- 中饭在一家饭馆,味道海星. 晚上和ykh,chj,xzt溜去吃一鸣和烧烤.一鸣不错,烧烤的话我因为口腔溃疡没怎么吃 ...

  4. Android Studio问题记录

    1>Android Studio中module是什么,? 答:Android Studio是基于intellij,跟eclipse不太一样.对应关系如下: intellij的project -- ...

  5. 五:SQL语句中的数据类型

    一:MySQL数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的 MySQL支持多种数据类型,大致可以分为三类:数值 日期/时间和字符串 二.数值类型(12) 2.1.整数类型(6) ...

  6. python爬虫(爬取视频)

    爬虫爬视频 爬取步骤 第一步:获取视频所在的网页 第二步:F12中找到视频真正所在的链接 第三步:获取链接并转换成机械语言 第四部:保存 保存步骤代码 import re import request ...

  7. PAT Basic 1063

    1063 计算谱半径 在数学中,矩阵的“谱半径”是指其特征值的模集合的上确界.换言之,对于给定的 n 个复数空间的特征值 { a​1​​+b​1​​i,⋯,a​n​​+b​n​​i },它们的模为实部 ...

  8. Arthas诊断工具使用资料

    1.https://github.com/alibaba/arthas/issues/327 2.https://alibaba.github.io/arthas/jad.html 3.https:/ ...

  9. linux 使用mail 发送邮件

    配置: /etc/mail.rc 追加配置参数 set from=lynctest@iclinux.com smtp="mail.iclinux.com"smtp-auth-use ...

  10. luogu3629 [APIO2010]巡逻

    创造一个环出来,可以让环上的边都只访问一次. 对于 \(k=1\),答案就是树的直径两边连起来. 倘若 \(k=2\),那就先按照 \(k=1\) 的求一遍,然后我们发现,如果第二条加的边构成的环和第 ...