• JavaWeb学习笔记(五)—— request


    一、request概述

      request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据

      通过抓包工具抓取Http请求

      因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请求头和请求体。

    二、request的功能

    2.1 获取请求行信息

    • request.getMethod():获取请求方式

    • request.getRemoteAddr():获取客户端IP

    • String getContextPath():获取项目名

    • String getQueryString():获取参数部分(username=xxx&password=yyy),post请求获得的是null

    • String getRequestURL():获取请求URL,等于不包含参数的整个请求路径(http://localhost:8080/day10_2/AServlet)

    • String getRequestURI():获取请求URI,等于项目名+Servlet路径(/day10_2/AServlet)

      public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          // 获得请求方式
          String method = request.getMethod();
          System.out.println("method:" + method);
          // 获得请求的资源相关的内容
          String requestURI = request.getRequestURI();
          StringBuffer requestURL = request.getRequestURL();
          System.out.println("uri:" + requestURI); //uri:/Day04/line
          System.out.println("url:" + requestURL); //url:http://localhost:8080/Day04/line
          // 获得web应用的名称
          String contextPath = request.getContextPath(); //web应用:/Day04
          System.out.println("web应用:" + contextPath);
          // 地址后的参数的字符串
          String queryString = request.getQueryString(); //username=zhangsan&password=123
          System.out.println(queryString);
          // 获得客户机的信息——获得访问者IP地址
          String remoteAddr = request.getRemoteAddr();
          System.out.println("IP:" + remoteAddr); //IP:0:0:0:0:0:0:0:1
      }

    2.2 获取请求头信息

    • String getHeader(String name):获取指定名称的请求头

      request.getHeader("referer") -->可用于防盗链
    • Enumeration getHeaderNames():获取所有请求头名称

    2.3 获取请求体信息

    【客户端传递参数的方式】

    • 浏览器地址栏直接输入:一定是GET请求;
    • 超链接:一定是GET请求;
    • 表单:可以是GET,也可以是POST,这取决与<form>的method属性值;

    【GET请求和POST请求的区别】

      GET请求:

      • 请求参数会在浏览器的地址栏中显示,所以不安全;
      • 请求参数长度限制长度在1K之内;
      • GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

      POST请求:

      • 请求参数不会显示浏览器的地址栏,相对安全;
      • 请求参数长度没有限制;

    【常用API】

    • String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数

    • String[] getParameterValues(String name):获取指定名称的请求参数值,适用于多值请求参数

    • Enumeration<String> getParameterNames():获取所有请求参数名称

    • Map<String,String[]> getParameterMap():获取所有请求参数,其中key为参数名,value为参数值

    【解决中文乱码】

    • post请求:
      request.setCharacterEncoding(“UTF-8”);
    • get请求:

      String name = request.getParameter(“name”)
      name = new String(name.getBytes(“iso-8859-1”), “utf-8”)

    2.4 其他功能

    【request是一个域对象】(作用范围:一次请求中)

    • void setAttribute(String name, Object value):用来存储一个对象
    • Object getAttribute(String name):用来获取request中的数据
    • void removeAttribute(String name):用来移除request中的域属性
    • Enumeration getAttributeNames():获取所有域属性的名称

    【request完成请求转发】

    • 获得请求转发器:RequestDispatcher rd = request.getRequestDispatcher(String path);——path是转发的地址
    • 通过转发器对象转发:rd.forward(request,response)

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

         *请求转发是一个请求一次响应,而重定向是两次请求两次响应

         *转发地址栏不变化,而重定向显示后一个请求的地址

         *转发只能转发到本项目其它servlet,而重定向不只能重定向到本项目的其它servlet,还能定向到其它项目

         *转发是服务器端行为,只需给出转发的servlet路径,而重定向要给出request URI,即包含项目名

         *转发的效率高,因为是一个请求

  • 相关阅读:
    ZeroMQ接口函数之 :zmq_msg_move
    ZeroMQ接口函数之 :zmq_msg_init_size
    Missing artifact org.hibernate:hibernate-core:jar:4.3.0.Final
    ezmorph将一种对象转换成另外一种对象
    Avalon Framework
    easymock单元测试跟踪工具
    pngencoder图像转换jar
    Lucene全文检索引擎
    cxf怎样提高webservice性能,及访问速度调优
    待整理-20180625
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10471881.html
Copyright © 2020-2023  润新知