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,即包含项目名
*转发的效率高,因为是一个请求