1.Request概述
用户通过浏览器访问服务器时,Tomcat将HTTP请求中所有的信息都封装在Request对象中。
作用:开发人员可以通过request对象方法,来获取浏览器发送的所有信息。
Request获取Http请求信息
String getMethod() 获取请求方式 GET
String getContextPath() 获取项目网络地址(虚拟路径)
String getRequestURI() 统一资源标识符(范围广)
StringBuffer getRequestURL() 获取URL(统一资源定位符)
String getProtocol() 获取协议和版本号 HTTP/1.1
String getRemoteAddr() 获取客户端ip地址
getLocalAddr() 获取用户ip地址
解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");
解决get提交的方式的乱码:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
String getHeader(String name) 根据请求头的名称获取对应的值,注意:不区分大小写 Enumeration<String> getHeaderNames() 获取所有请求头的名称
request.setCharacterEncoding("utf-8");
System.out.println("请求方式=" + req.getMethod());
System.out.println("项目名=" + req.getContextPath());
System.out.println("当前访问相对目录=" + req.getRequestURI());
System.out.println("当前访问绝对路径=" + req.getRequestURL());
System.out.println("http版本号=" + req.getProtocol());
System.out.println("获取用户ip地址=" + req.getLocalAddr());
System.out.println("获取ip地址=" + req.getRemoteAddr());
System.out.println("--------------------------两个绝对路径=");
System.out.println(this.getServletContext().getRealPath("/"));
System.out.println(req.getSession().getServletContext().getRealPath("/"));
String path = req.getContextPath();
String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/";
System.out.println("拼接获取服务器加模块名=" + basePath);
//获取请求头
String header = req.getHeader("Host");
System.out.println(header);
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
String sname = headerNames.nextElement();
String header1 = req.getHeader(sname);
System.out.print(sname + "::" + header1);
}
注意:在jsp中获取静态路径使用的是 req.getContextPath()
对应的jsp页面表达:${pageContext.request.contextPath}或<%=request.getContextPath()%>
获取请求参数
不论get还是post请求方式,都可以使用下列方法来获取请求参数
在web阶段,get和post方法处理的业务逻辑是一样的
--根据参数名获取参数值
String getParameter(String name)
--根据参数名获取参数值数组 例如 hobby=somke&hobby=drink
String[] getParameterValues(String name)
--获取所有的参数名和参数值,封装map集合(key参数名,value参数值)
Map<String,String[]> getParameterMap()
请求转发
* API
1.通过reuqest对象获取转发器对象
RequestDispatcher getRequestDispatcher(String path)
2.通过转发器对象,实现请求转发
void forward(ServletRequest request, ServletResponse response)
* 请求转发特点
浏览器地址栏没有发生改变
浏览器只发送了一次请求(request、response只创建一次,多个转发的servlet共享)
只能转发服务器内部资源
* 链式编程
request.getRequestDispatcher("/BaseServlet").forward(request, response);
域对象(共享数据)
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据
* API
1.存数据: void setAttribute(String name,Object o);
2.获取数据: Object getAttribute(String name);
3.删除数据: void removeAttribute(String name);
* 生命周期
1.创建:用户发送请求时,创建request
2.销毁:服务器做出响应,销毁request
3.范围:一次请求,多次转发
获取ServletContext对象
public ServletContext getServletContext(); 此对象为Servlet上下文对象,只会创建一个
补充案例:
- 视频防盗链
/*
视频播放源,判断是否合法...
*/
@WebServlet("/RefererRequest")
public class RefererRequest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
// 1.获取请求来源信息(注意:如果浏览器直接访问,这个头返回的值为null)
String referer = req.getHeader("referer");
// 2.判断是否为家族体系访问源
if (referer != null &&
referer.startsWith("http://localhost:8080/web09_request")) {
resp.getWriter().write("<h3>正常播放视频...</h3>");
} else {
resp.getWriter().write("<h3>想看这个视频吗?那就来优酷吧...</h3>");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
}
}
- 浏览器兼容性 (user-agent:获取浏览器版本信息)
/*
浏览器兼容性
*/
@WebServlet("/UserAgentRequest")
public class UserAgentRequest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
// 1.获取浏览器的信息
String userAgent = req.getHeader("user-agent");
// 2.判断条件
if (userAgent.contains("Chrome")) {
resp.getWriter().write("谷歌体系浏览器");
} else if (userAgent.contains("Firefox")) {
resp.getWriter().write("火狐体系浏览器");
} else {
resp.getWriter().write("其他体系浏览器");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
}
}
其他常用方法:
request.getServletPath() 获取客户端请求的路径名
request.getServerName() 获取服务器地址,如:localhost
request.getServerPort() 获取服务器端口,如8080
request.getLocalName() 获取本地IP映射名,如:localhost
request.getLocalPort() 获取本地端口,如:8091
request.getRealPath("/") 获取项目所在服务器的全路径
request.getRemoteAddr() 获取远程主机地址,如:127.0.0.1
request.getRemoteHost() 获取远程主机,如:127.0.0.1
request.getRemotePort() 获取远程客户端端口
request.getRequestedSessionId() 获取会话session的ID
request.getRequestURI() 获取包含项目名称的请求路径
request.getRequestURL().toString() 获取请求的全路径