request
request功能介绍
获取请求头 获取请求参数 Servlet三大域对象之一 请求包含和请求转发
request域方法
java
void setAttribute(String name, Object value):添加或替换request域属性
Object getAttribute(String name):获取request域指定名称的域属性
void removeAttribute(String name):移除request域指定名称的域属性
Enumeration getAttributeNames():获取所有request域的属性名称
request获取请求头
String getHeader(String name):获取指定名称的请求头
int getIntHeader(String name):获取指定名称的请求头,把值转换成int类型。
Enumeration getHeaderNames():获取所有请求头名称
request请求数据相关其他方法
重点:
- String getMethod():获取请求方式
- String getContextPath():获取上下文路径,即“/” + 应用名称,例如:/day05_1
- void setCharacterEncoding(String):设置请求体的编码
- String getRemoteAddr():获取客户端IP地址
非重点:
int getContentLength():获取请求体字节数
Locale getLocale():获取请求Locale,例如zh_CN表示中文,中国
String getCharacterEncoding():获取请求体编码,在没有调用setCharacterEncoding()之前该方法返回null
String getQueryString():获取参数列表,例如:username=zhangSan&password=123
String getRequestURI():返回请求URI路径,从应用名称开始,到参数之前这一段,例如:/day05_1/AServlet
StringBuffer getRequestURL():整个请求URL,不包含参数部分
String getServletPath():返回Servlet路径,从应用名称后开始,到参数之前这一段,不包含应用名称。
String getServerName():返回主机名,例如:localhost * int getServerPort():返回服务器端口号,例如:8080
请求参数
获取请求参数,即获取超链接上的参数和表单中的参数
String getParameter(String name):获取指定名称的参数,如果存在同名参数,那么该方法只获取第一个参数值
String[] getParameterValues(String name):获取指定名称的参数,因为同名参数的存在,所以返回值为字符数组
Enumeration getParameterNames():获取所有参数名称
Map getParameterMap():获取所有参数,封装到Map中,key为参数名称,value为参数值。
请求包含和请求转发
共同点
都是在一个请求中,访问两个Servlet。
都是有一个Servlet去调用执行另一个Servlet
都可以共享request中的数据,因为都是一个请求。
都要使用RequestDispatcher对象:RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
请求转发和请求包含的路径都是服务器端路径,相对当前应用
不同点
1.从AServlet到BServlet
请求转发:在AServlet中可以设置响应头能使用响应流输出
请求包含:在AServlet可以设置响应头可以使用响应流输出
2.执行代码
请求转发:request.getRequestDispatcher("/BServlet").forward(request,response);
请求包含:request.getRequestDispatcher("/BServlet").include(request,response);
请求转发与重定向
请求转发是一个请求,而重定向是两个请求
请求转发,是使用RequestDispatcher来完成,重定向使用response对象来完成
请求转发的路径都是服务器端路径,而重定向是客户端路径,需要给出应用名称
请求转发在浏览器地址栏中的地址是第一个Servlet的路径,而重定向在地址栏中的地址是第二个请求的Servlet的路径
请求转发中的两个Servlet是可以共享request数据的,而重定向因为是两个请求,所以不能共享request数据
请求转发只能转发到本应用的其他Servlet,而重定向可以重定向到其他应用中。
request.getParameter()和request.getAttribute()
getParameter() 是获取客户端参数,它是从客户端传递给服务器的数据。
getAttribute() 是获取服务器端自己设置的数据,而不是客户端的数据。
request没有setParameter() 方法,不能自己设置参数,参数都由客户端传递
request有setAttribute() 方法,在getAttribute()之前,需要先setAttribute()才能获取到。
getAttribute()和setAttribute() 是用来在请求转发和请求包含中的多个Servlet中共享数据。
路径
- 客户端路径和服务器端路径
- 客户端路径需要给出应用名称,例如:/day05_1/AServlet
- 服务器端路径无需给出应用名称,例如:/AServlet
- 客户端路径
- 页面中都是客户端路径:
- 超链接的href
- 表单的action
- <img>的src
- 重定向也是客户端路径:response.sendRedirect("/day05_1/BServlet");
- 页面中都是客户端路径:
- 服务器端路径
- <url-pattern>
- 请求转发和请求包含
- ServletContext获取资源等
案例
案例一 【获取用户的IP 浏览器等信息】
package com.yuan.web.request;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author Yuan-9826
*/
@WebServlet("/req/AServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
final String IP = request.getRemoteHost();
System.out.println("IP : " + IP);
final String method = request.getMethod();
System.out.println("请求方式 : " + method);
final String header = request.getHeader("User-Agent");
System.out.println("请求头 : " + header);
/*
最后一个请求头就拿到了 操作系统 浏览器等信息
Mozilla
/5.0 (Windows NT 10.0; WOW64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome
/70.0.3538.25 Safari
/537.36 Core
/1.70.3730.400 QQBrowser
/10.5.3805.400
*/
}
}
案例二 【请求路径演示】
package com.yuan.web.request;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author Yuan-9826
*/
@WebServlet("/req/BServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
//协议
response.getWriter().print("<h1>"+request.getScheme()+"</br></h1>");
//主机名
response.getWriter().print("<h1>"+request.getServerName()+"</br></h1>");
//端口
response.getWriter().print("<h1>"+request.getServerPort()+"</br></h1>");
//项目名
response.getWriter().print("<h1>"+request.getContextPath()+"</br></h1>");
//Servlet路径
response.getWriter().print("<h1>"+request.getServletPath()+"</br></h1>");
//参数
response.getWriter().print("<h1>"+request.getQueryString()+"</br></h1>");
//URI
response.getWriter().print("<h1>"+request.getRequestURI()+"</br></h1>");
//URL
response.getWriter().print("<h1>"+request.getRequestURL()+"</br></h1>");
}
}


案例三 【防盗链】
补充【地址栏里输入 头信息为空】
package com.yuan.web.request;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author Yuan-9826
*/
@WebServlet("/req/cservlet")
public class CServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
final String referer = request.getHeader("Referer");
//这就获取到了访问的来源
System.out.println("referer = " + referer);
//可以获取他的IP之类的一通操作
}
}