request对象
Request 的全称是 HttpServletRequest,
代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,
HTTP 请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,
可以获得客户这些信息。
Request 对象常用操作:
1. 可以获取所有客户端去请求数据
2. 可以进行页面跳转—请求转发
//页面跳转,跳转到DemoServlet,urlPatterns = "/demo"
//request.getRequestDispatcher(url);
//url 就是页面跳转地址,以“/”开始,该代码是在服务器中执行,就代表当前项目名称为根目录下
//request.getRequestDispatcher("demo").forward(request, response);
request.getRequestDispatcher("/demo").forward(request, response);
3. 可以获取当前应用程序名称
request.getContextPath()
4. request是一个域对象
域对象
可以在不同Servlet之间传递数据的对象,就是域对象
只要是域对象都有如下方法
setAttribute(name,value);存储数据的方法
getAttribute(name);根据name获取对应数据值
removeAttribute(name);删除数据
Request 获取请求行信息
HTTPhttp 协议中请求行的内容分为:
请求方式、请求路径、协议版本。
String getMethod() 获取请求方式的类型
String getRequestURI() 获取客户端发送请求行中资源名称部分
StringBuffer getRequestURL() 获取客户端发送请求完整URL
//uri是统一资源标识符,用来标识一个资源路径。
//url是统一资源定位符,是一种具体的uri,
//可以用来标识一个资源,并且指明了如何定位一个资源。
String getProtocol() 获取当前协议的名称和版本
String getRemoteAddr() 获取IP地址
int getLocalPort() 获取端口号
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取请求方式
String method = request.getMethod();
//获取请求的 URL,请求的完整路径
String url = request.getRequestURL().toString();
//获取请求的 URI,请求资源,
String uri = request.getRequestURI();
//获取请求的协议和版本
String protocol = request.getProtocol();
//获取客户端的 IP 地址
String clientIP = request.getRemoteAddr();
//获取服务器的端口号
int serverPort = request.getLocalPort();
System.out.println(method);
System.out.println(url);
System.out.println(uri);
System.out.println(protocol);
System.out.println(clientIP);
System.out.println(serverPort);
}
Request 获取请求头信息
String getHeader(String name) 以String的形式返回指定请求头中某一头名称的值
//request.getHeader("Referer") 获取 Referer 请求头
Enumeration getHeaderName() 返回此请求包含的所有头名称的枚举
Host 服务器的域名
Origin 服务器名称
User‐Agent 当前系统和浏览器版本
Referer 本次请求来源路径
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取 referer 请求头,表示本次请求,来源于什么地址
String referer = request.getHeader("Referer");
if(referer!=null) {
System.out.println(referer);
}else{
System.out.println("你是直接访问 DemoServlet 的");
}
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//调用 doPost
this.doPost(request,response);
}
使用 referer 实现防盗链
两次请求同一个域名,显示可以下载
两次请求同不同域名,显示无法下载
1. 创建一个 download.html 和 DownloadServlet。
2. 在 DownloadServlet 中使用 request 对象的 getHeader 方法获取 referer 请求头信息。
3. 通过 referer 判断请求的来源地址,判断是否与当前项目统一。
4. 如果与当前项目统一就显示可以下载,否则显示不可以下载,因为是盗链的。
download.html
...
<body>
<a href="http://127.0.0.1:8080/demo/DownloadServlet">下载</a>
</body>
...
DownloadServlet
...
@WebServlet(name = "DownloadServlet",urlPatterns = "/DownloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取请求头中的 referer
String referer = request.getHeader("referer");
System.out.println("referer=" + referer);
String str="http://127.0.0.1:8080/demo/download.html";
//如果非空且来源合法
if(referer != null &&str.equals(referer)){
System.out.println("请求合法,允许下载。。。");
}else{
System.out.println("请求不合法,不允许下载。。。");
}
}
}
获取用户当前使用的浏览器版本
1. 创建 UserAgentServlet
2. 调用 request 的 getHeader 方法,获取消息头 User-Agent
3. 打印在控制台上
...
@WebServlet(name = "UserAgentServlet",urlPatterns = "/UserAgentServlet")
public class UserAgentServlet extends HttpServlet {
HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取请求头--user-agent
String userAgent = request.getHeader("user-agent");
System.out.println(userAgent);
}
}
Request 对象请求体信息
请求体的数据是客户端post提交请求的参数数据
String getParameter(String name)
返回指定名称的一个参数数据值
String[] getParameterValues(String name)
返回指定名称的一组参数数据值
//用户名
String username = request.getParameter("username");
//密码
String pwd = request.getParameter("password");
//爱好
String[] hobbies = request.getParameterValues("hobby");
OutputStream outputStream = response.getOutputStream();
outputStream.write(("<p>username:"+username+"</p>").getBytes());
outputStream.write(("<p>password:"+pwd+"</p>").getBytes());
outputStream.write(("<p>hobby:"+ Arrays.toString(hobbies)+"</p>").getBytes());
页面跳转—请求转发
RequestDispatcher getRequestDispatcher(String path) 获取请求转发器 (request对象方法)
void forward(ServletReqeust request,ServletResponse response)
将请求转发到另外一个资源(servlet)上 (RequestDispatcher对象方法)
//页面跳转,跳转到Demo2Servlet
//request.getRequestDispatcher(url);获取请求转发器
//url 就是页面跳转地址,以“/”开始,就代表当前项目名称为根目录
request.getRequestDispatcher("/demo2").forward(request, response);
获取当前工程名字
//输出当前共工程的名字
System.out.println("当前工程名字:"+request.getContextPath());
request是一个域对象
域对象
可以在不同Servlet之间传递数据的对象,就是域对象
只要是域对象都有如下方法
setAttribute(name,value);存储数据的方法
getAttribute(name);根据name获取对应数据值
removeAttribute(name);删除数据
//定义数据
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
//使用域对象request存储数据
request.setAttribute("emplist", list);
//页面跳转
request.getRequestDispatcher("/requestGetData").forward(request, response);
//从域对象里面获取数据
Object object = request.getAttribute("emplist");
if(object!=null){
List<String> list = (List<String>) object;
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}