JavaWeb -- Http请求消息 -- Request获取请求消息(基础)代码演示

Http

概念:Hyper Text Transfer Protocol 超文本传输协议

传输协议 : 定义了,客户端和服务器端通信时,发送数据的格式

特点

  1. 基于TCP/IP的高级协议

  2. 默认端口号:8080

  3. 基于请求/响应模型的;一次请求对应一次响应

  4. Http协议是无状态的,每次请求都是相互独立的,不能交互数据

请求消息数据格式:

  • 请求行

    请求方式 请求url 请求协议/版本

    请求方式:(Http协议有7中请求方式,常用2中)

    get:

    1. 请求参数在请求行中,在Url后
    2. 请求的url是有限度的
    3. 不太安全

    post:

    1. 请求参数在请求体中
    2. 请求参数的url长度没有限制
    3. 相对安全
  • 请求头 : 客户端浏览器告诉服务器一些信息

    请求头名称 : 请求头值

    1. User-Agent : 浏览器告诉服务器, 我访问你使用的浏览器版本信息

      可以在服务器端获取该头的信息,解决浏览器的兼容性问题

    2. Referer: 告诉服务器,当前请求从哪里来?

      ​ 作用:

      防盗链:原理:在下载服务器上,来判断一下上一步提交的网址(来源)是不是我要求的,如果是我要求的,那么可以下载,如果不是,不让下载

      统计工作

  • 请求空行

    空行,就是用于分割POST请求的请求头,和请求体的

  • 请求体 ( 正文 )

    封装post请求消息的请求参数的

Request:(获取请求消息)

Request 与 Response 对象的原理

  1. 首先我们的浏览器给我发了请求(请求消息),然后我们的请求带着请求消息找我们的资源,因为我们在服务器端配置了 url-pattern 找到这个类后 Tomcat会自动执行这个方法 也就是:tomcat 服务器会根据请求的URL中的资源路径,创建对应的ServletDemo01的对象
  2. tomcat服务器,会创建requestresponse对象,request对象中封装请求消息数据
  3. requestresponse两个对象 传递给service方法,并且调用了Service方法
  4. 我们可以通过request对象来获取请求消息数据,通过response对象设置响应消息数据
  5. (浏览器回复响应消息) 服务器给浏览器做出响应之前,会从response对象中拿出程序员设置的响应消息数据

Request 继承体系结构

ServletRequest接口 继承 HttpServletRequest

HttpServletRequest 接口 实现了RequestFacade类(Tomcat)

Request 获取请求行数据

GET /Demo02_war_exploded /sd/demo?name=zhangsan HTTP/1.1

方法 :

  1. 获取请求方式 :GET

    String getMethod()

  2. 获取虚拟目录 :Demo02_war_exploded

    String getContextPath()

  3. 获取Servlet路径 :sd

    String getServletPath()

  4. 获取get方式请求参数:name=zhangsan

    String getQueryString()

  5. 获取请求URI:/Demo02_war_exploded /sd

    String getRequestURI(); /Demo02_war_exploded /sd

    StringBuffer getRequestURL() http://localhost//Demo02_war_exploded /sd

    URI :统一资源标识符 (URI 要比URL小)

    URL :统一资源定位符

  6. 获取协议及版本 :HTTP/1.1 (了解就好)

    String getProtocol()

  7. 获取客户机的IP地址: ( 了解就好)

    String getRemoteAddr()

代码演示 上面的方法

@WebServlet("/sd")
public class ServiceDemo01 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //获取请求方式  GET
        System.out.println(request.getMethod());
        //获取虚拟目录  Demo02_war_exploded
        System.out.println(request.getContextPath());
        //获取Servlet路径  sd
        System.out.println(request.getServletPath());
        //获取get方式请求参数
        System.out.println(request.getQueryString());
        //获取请求URI
        System.out.println(request.getRequestURI());
        System.out.println(request.getRequestURL());
        //协议和版本
        System.out.println(request.getProtocol());
        //获取客户机IP
        System.out.println(request.getRemoteAddr());
    }
}

在这里插入图片描述

获取请求头数据

方法:

  1. String getHaeder (String name) :通过请求头的名称获取请求的值
  2. Enumeration getHeaderNames(): 获取所有的请求头的名称
@WebServlet("/sd2")
public class ServiceDemo02 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
       //获取所有的请求头名称
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()){
    
    
            String s = headerNames.nextElement();
            String header = request.getHeader(s);
            System.out.println(s+header);
        }
    }
}

在这里插入图片描述

//演示获取请求头数据:user-agent 来查看当前我们用的什么浏览器
String agent = request.getHeader("user-agent");
if (agent.contains("Chrome")){
    
    
    System.out.println("谷歌");
}else if (agent.contains("Firefox")){
    
    
    System.out.println("火狐");
}

在这里插入图片描述

防盗链:(演示获取请求头数据 : referer)

第一个项目 模拟官方 就叫Demo02

@WebServlet("/sd4")
public class ServletDemo03 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //演示获取请求头数据 : referer
        String referer = request.getHeader("referer");
        if(referer != null){
    
    
            if (referer.contains("/Demo02_war_exploded")){
    
    
                System.out.println("看电影");
            }else {
    
    
                System.out.println(referer);
                System.out.println("来我这里看电影");
            }
        }
    }
}

页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>官方的电影院</title>
  </head>
  <body>
 <a href="/Demo02_war_exploded/sd4">点我上天堂</a>
  </body>
</html>

在新建一个项目 就叫 Demo04(注意 要新建一个Tomcat 还要区分端口号)

index.jsp 页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>我自己的电影院</title>
  </head>
  <body>
  <a href="http://localhost:8080/Demo02_war_exploded/sd4">点我上天堂</a>
  </body>
</html>

先启动 Demo04 在启动 Demo02

进入Demo02 后点击 点我上天堂

在这里插入图片描述
在这里插入图片描述

在 Demo04 里点击

在这里插入图片描述
在这里插入图片描述

获取请求体数据

请求体:只有POST请求方式才有请求体,在请求体中封装了POST请求的请求参数

  1. 获取流对象

    BufferedReader getReader( ) ; 获取字符输入流,对应的只能操作字符数据

    ServletInputStream getInputStream ( ) : 获取字节输入流,可以操作所有的类型的数据

  2. 再从流对象中拿数据

代码演示:

@WebServlet("/std4")
public class ServletDemo04 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        BufferedReader reader = request.getReader();
        response.setContentType("text/html;charset=utf-8");
        String len=null;
        while ((len=reader.readLine())!=null){
    
    
            response.getWriter().write(len);
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

    }
}

页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<body>
  <form action="${pageContext.request.contextPath}/std4" method="post"  enctype="text/plain" accept-charset="UTF-8">
    用户名:<input type="text" placeholder="请输入用户名" name="username"/> <br>
    密  码: <input type="password"  placeholder="请输入密码" name="pwd"/> <br>
      <input type="submit" value="提交">

  </form>
</body>

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/agood_man/article/details/108567245
今日推荐