HttpServletRequest(HttpServletRequest 想比 ServletRequest 添加与协议相关 API)对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户信息。
通过Request对象进行的常用操作:
- 获取客户机信息
- 获取请求头信息
- 获取请求参数
- 利用请求域传递对象
(一)获取客户机信息
常用方法:
public String getContextPath();/获取请求的上下文路径
public StringBuffer getRequestURL();/返回客户端发出请求的完整URL
public String getRequestURI();/返回请求行中的资源名部分
public String getQueryString();/返回请求行中的参数部分
public String getMethod();/返回客户机请求方式,如get,post等
public String getRemoteAddr();/返回发出请求的客户机的IP地址
public class RequestServlet1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 问题一 区分 getRequestURL 和 getRequestURI
System.out.println("url:" + request.getRequestURL());
System.out.println("uri:" + request.getRequestURI()); // 返回
// /day06/request1
// 问题二:了解 通过 getQueryString 可以获得 get方式提交查询串 url中?后面部分
System.out.println("querystring:" + request.getQueryString());
// 获得客户端ip
System.out.println("ip: " + request.getRemoteAddr());
// 通过 getContextPath 获得工程虚拟目录名称
System.out.println(request.getContextPath()); // 返回 /requesttest
// 通过getMethod 获得请求方式
System.out.println("请求方式 : " + request.getMethod());
// 问题: 获得当前访问资源路径 --- /request1
System.out.println("当前访问资源路径 :"
+ request.getRequestURI().substring(
request.getContextPath().length()));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
输出:
url:http://localhost:8080//requesttest/request1
uri://requesttest/request1
querystring:null
ip: 127.0.0.1
//requesttest
请求方式 : GET
当前访问资源路径 :/request1
区别URL(统一资源定位符)与URI(统一资源标识符):
url:http://localhost/requesttest/request1 — 完整
uri:/requesttest/request1 —- 部分
URI 包含 URL的 ,URL 一定完成路径,URI可以相对路径
http://localhost/requesttest/request1 是一个URL 同时也是 URI
./hello /requesttest/request1 —- 都是URI 不是URL
querystring:null
由于请求中没有查询串,因此querystring为null,如果改成http://localhost/requesttest/request1?username=megustas则输出变为
querystring:username=megustas
即通过 getQueryString 可以获得 get方式提交查询串 url中?后面部分
获得当前访问资源路径 :
request.getRequestURI().substring(request.getContextPath().length());
在URI的基础上去掉工程虚拟目录名称的部分,剩下的就是当前访问的资源的路径。
(二)获取请求头信息
getHeader 获得头信息的值,转换一个字符串
getHeaders 获得头信息值 ,获得Enumeration
getHeaderNames 获得所有头信息名称 返回 Enumeration
- 掌握getHeader使用,遍历Enumeration 获得所有头信息
public class RequestServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("test...");
// 获得指定头信息字段 Accept-Encoding: gzip, deflate
String value = request.getHeader("Accept-Encoding"); // 如果头信息存在多个值,将多个值拼接到一起,形成String
System.out.println(value); // gzip, deflate
System.out.println("--------------------------------");
// 获得所有头信息内容 ---- 获得所有头信息名称
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement(); // name 就是一个头信息名字
System.out.println(name + ":" + request.getHeader(name));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
通过头信息可以进行防盗链,存在合法referer不是盗链,否则控制目标资源无法访问 (因为直接输入网址的情况没有refer的头信息)
* 通过URL 绕过盗链判断
(三)获取请求参数
请求参数:用户通过请求提交服务器的一些数据—–< a href=”url?xxx=xxx” >、< form method=”get”> 、 < form method=”post”>
可以通过getParameter(name)方法来获取
html页面:
<body>
<h1>分别以get 和 post方式 提交数据</h1>
<h1>第一种 通过超链接 提交数据 以?方式</h1>
<!-- 包括两个参数的 name 和 city -->
<a href="/requestexample/request4?name=zhangsan&city=beijing">超链接提交数据</a>
<h1>第二种 通过form的post方式提交数据</h1>
<form action="/requestexample/request4" method="post">
请输入姓名 <input type="text" name="name" /><br/>
请输入城市 <input type="text" name="city" /> <br/>
<input type="submit" value="提交" />
</form>
</body>
public class RequestServlet4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 通过getParameter 获得请求数据
String name = request.getParameter("name");
System.out.println(name);
String city = request.getParameter("city");
System.out.println(city);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}