HttpServletRequest
1、概述:
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表的响应response。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。
2、request的运行流程
3、通过抓包工具抓取Http请求
因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请求头和请求体
4、通过request获得请求行
获得客户端的请求方式:String
getMethod()
获得请求的资源:
String
getRequestURI()
获得请求地址
StringBuffer
getRequestURL()
获得网络地址
String
getContextPath()
---
获得
web
应用的名称
String
getQueryString()
----
只能获得
get
方式
提交
url
地址后的参数字符串 如:username=zhangsan&password=123
注意:request获得客户机(客户端)的一些信息
request.getRemoteAddr() --- 获得访问的客户端IP地址
5、通过request获得请求头
long
getDateHeader(
String name)
String
getHeader(
String name)
Enumeration
getHeaderNames()
Enumeration
getHeaders(
String name)
int
getIntHeader(
String name)
referer头的作用:执行该此访问的的来源,做防盗链 (referer的内容为访问的网络地址)

package com.oracle.demo01; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RefererServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取referer请求头 String referer=request.getHeader("referer"); //对该访问的来源进行判断 //如果判断成功,代表我自己的域名,就可以访问 if(referer!=null&&referer.startsWith("http://localhost:8080")){ response.setContentType("text/html;charset=utf-8"); response.getWriter().write("习大大擘画新时代党的组织路线图"); }else{ response.setContentType("text/html;charset=utf-8"); response.getWriter().write("你是盗链者,丢不丢人"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

Jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="/WEB04/RefererServlet">习大大说新时代</a> <form action="/WEB04/LoginServlet" method="get"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="pwd"><br> <input type="submit" value="登陆"><br> <input type="reset" value="重置"> </form> </body> </html>

代码演示:

package com.oracle.demo01; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求行里信息的方法 //获取请求方式 String method=request.getMethod(); System.out.println(method); //获取请求资源的相关内容 String requestURI=request.getRequestURI(); StringBuffer requestURL=request.getRequestURL(); System.out.println("requestURI:"+requestURI); System.out.println("requestURL:"+requestURL); //获取WEB应用的名称 String name=request.getContextPath(); System.out.println(name); //获取get方式提交后url地址后的字符串 String queryString=request.getQueryString(); System.out.println(queryString); //获取客户机的信息----获取访问者的IP地址 String ip=request.getRemoteAddr(); System.out.println(ip); //获取请求头中的内容 //获取指定头 String header=request.getHeader("User-Agent"); System.out.println(header); //获得所有头的名称 Enumeration<String> en=request.getHeaderNames(); //以键值对的形式获得,并保存在集合中 while(en.hasMoreElements()){ //遍历,获得键和值 String headerName=en.nextElement(); String headerValue=request.getHeader(headerName); System.out.println(headerName+":"+headerValue); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

6、通过request获取请求体
String
getParameter(
String name)
String[]
getParameterValues(
String name)
Enumeration
getParameterNames()
Map<String,String[]>
getParameterMap()
注意:get请求方式的请求参数 上述的方法一样可以获得
解决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)
注意:
ServletContext
域与
Request
域的生命周期比较?
ServletContext
:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个
web
应用
request
:
创建:访问时创建
request
销毁:响应结束
request
销毁
域的作用范围:一次请求中
注意:转发与重定向的区别?
1
)重定向两次请求,转发一次请求
2
)重定向地址栏的地址变化,转发地址不变
3
)重新定向可以访问外部网站
转发只能访问内部资源
4
)转发的性能要优于重定向
代码演示:

package com.oracle.demo02; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //向request域中存值 request.setAttribute("name", "wang"); //请求转发 //获得转发器对象,并调用转发方法 request.getRequestDispatcher("/Servlet02").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

总结:
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)
