1.HttpServletRequest概述

在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。

2.request的运行流程

3.通过抓包工具抓取Http请求

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

request

  • 请求行:请求资源-http协议版本:1.1/1.0
  • 请求头

    • 格式:键值对key:value
    • 请求头是浏览器自动封装的,这些是浏览器要告知服务器的一些信息
  • 请求体

    • 请求参数(post提交的请求参数)
    • get提交:请求参数在url地址后面?
    • post提交:请求参数在http请求体重封装

4.通过request获得请求行

获得客户端的请求方式:String getMethod()

获得请求的资源:
String getRequestURI()
StringBuffer getRequestURL()
String getContextPath() ---web应用的名称
String getQueryString() ---- get提交url地址后的参数字符串
username=zhangsan&password=123
request.getRemoteAddr() --- 获得访问的客户端IP地址

//1.获得请求方式
String method = request.getMethod();
System.out.println("method:" + method);

//2.获得请求的资源相关的内容
String requestURI = request.getRequestURI();
System.out.println("requestURI:" + requestURI);

StringBuffer requestURL = request.getRequestURL();
System.out.println("requestURL:" + requestURL);

//3.获得web应用的名称
String contextPath = request.getContextPath();
System.out.println("web应用:" + contextPath);

//4.地址后的参数的字符串
String queryString = request.getQueryString();
System.out.println("queryString:" + queryString);

//5.获得客户端的IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println("remoteAddr:" + remoteAddr);
<form action="/request/line" method="post">
    <input type="text" name="username"><br>
    <input type="password" name="password"><br>
    <input type="submit" name="提交"><br>
</form>

5.通过request获得请求头

long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)
//1.获得指定的头
String header = request.getHeader("User-Agent");
System.out.println(header);

//2.获得所有头的名字
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
    String headerName = headerNames.nextElement();
    String headerValue = request.getHeader(headerName);
    System.out.println(headerName + ":" + headerValue);
}

referer头的作用:执行该此访问的的来源, 做防盗链

//对该新闻的来源进行判断
String header = request.getHeader("referer");
if (header!=null&&header.startsWith("http://localhost")) {
//是从我自己的网站跳转过去的,可以看新闻
    response.setContentType("text/html;charset=UTF-8");
    response.getWriter().write("英雄联盟IG战队夺冠...");

}else{
    response.getWriter().write("请不要盗链!");
}

6.通过request获得请求体

请求体中的内容是通过post提交的请求参数,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key                        value
username                [zhangsan]
password                [123]
hobby                    [football,basketball]
以上面参数为例,通过一下方法获得请求参数:
String getParameter(String name)
String(#getParameterValues(java.lang.String))(String name)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap()
注意:get请求方式的请求参数 上述的方法一样可以获得
request.setCharacterEncoding("utf-8");
//1.获得单个表单值
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);

//2.获得多个表单的值
String[] hobbys = request.getParameterValues("hobby");
for (String hobby:hobbys){
    System.out.println(hobby);
}

//3.获得所有的请求参数的名称
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
    System.out.println(parameterNames.nextElement());
}
System.out.println("----------------------");

//4.获得所有的参数,封装到一个Map<String,String[]>
Map<String, String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String, String[]> entry:parameterMap.entrySet()){
    System.out.println(entry.getKey());
    for (String str:entry.getValue()){
        System.out.println(str);
    }
    System.out.println("----------------------");
}
post提交乱码:request.setCharacterEncoding("UTF-8");
get提交乱码:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

7.request的其他功能

(1) request是一个域对象
request对象也是一个存储数据的区域对象,所以也具有如下方法:
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
注意:request域的作用范围:一次请求中
(2) request完成请求转发
获得请求转发器----path是转发的地址
RequestDispatcher getRequestDispatcher(String path)

通过转发器对象转发
requestDispathcer.forward(ServletRequest request, ServletResponse response)

(3)注意
  • ServletContext域与Request域的生命周期比较?

    • Servlet Context:

      • 创建:服务器启动
      • 销毁:服务器关闭
      • 域的作用范围:整个web应用
    • request:

      • 创建:访问时创建request
      • 销毁:响应结束request销毁
      • 域的作用范围:一次请求中
  • 转发与重定向的区别?

    • 1)重定向两次请求,转发一次请求
    • 2)重定向地址栏的地址变化,转发地址不变
    • 3)重新定向可以访问外部网站 转发只能访问内部资源
    • 4)转发的性能要优于重定向
  • 客户端地址与服务器端地址的写法?

    • 客户端地址:

      • 是客户端去访问服务器的地址,服务器外部的地址,
      • 特点:写上web应用名称
      • 直接输入地址:
      • 重定向
    • 服务器端地址:

      • 服务器内部资源的跳转的地址,
      • 特点:不需要写web应用的名称
      • 转发

8. 总结

  • request获得行的内容

    • request.getMethod()
    • request.getRequestURI()
    • request.getRequestURL()
    • request.getContextPath()
    • request.getRemoteAddr()
  • request获得头的内容

    • request.getHeader(name)
  • request获得体(请求参数)

    • String request.getParameter(name)
    • Map<String,String[]> request.getParameterMap();
    • String[] request.getParameterValues(name);
    • 注意:客户端发送的参数 到服务器端都是字符串
  • 获得中文乱码的解决:

    • post:request.setCharacterEncoding(“UTF-8”);
    • get:parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”);
  • request转发和域

    • request.getRequestDispatcher(转发的地址).forward(req,resp);
    • request.setAttribute(name,value)
    • request.getAttribute(name)

扎瓦
36 声望33 粉丝

笑吾庐,门掩草,径封苔。