HTTP协议(下)
request请求和response响应
request请求
request是服务器就九大内置对象之一,是与请求相关的请求对象。
request的体系结构
ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
request请求行常用到的方法
返回值 | 方法名称 | 方法介绍 |
---|---|---|
String | getMethod() | 获取请求方式,例如: GET/POST |
String | getContextPath() | 获取虚拟目录,例如: /day17 |
String | getProtocol() | 获取协议及版本,例如:HTTP/1.1 |
String | getRemoteAddr() | 获取客户机的IP地址,例如:192.168.26.10 |
String | getServletPath() | 获取客户机的地址,例如: /demo1 |
String | getQueryString() | 获取get方式请求参数列表,例如:name=zhangsan&password=123 |
String | getRequestURI() | 获取请求URI(统一资源标识符),例如:/day17/demo1 |
String | getRequestURL() | 获取请求URL(统一资源定位符),例如:http://localhost:8080/day17/demo1 |
request请求头常用到的请求头
1.获取referer头(防盗链示例)
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示获取请求头数据:referer
String referer = request.getHeader("referer");
System.out.println(referer);//http://localhost/day14/login.html
//防盗链
if(referer != null ){
if(referer.contains("/day14")){
//正常访问
// System.out.println("播放电影....");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("播放电影....");
}else{
//盗链
//System.out.println("想看电影吗?来优酷吧...");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("想看电影吗?来优酷吧...");
}
}
}
}
2.获取user-agent头(甄别在一次请求中的浏览器信息)
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.演示获取请求头数据:user-agent
String agent = request.getHeader("user-agent");
//判断agent的浏览器版本
if(agent.contains("Chrome")){
//谷歌
System.out.println("谷歌来了...");
}else if(agent.contains("Firefox")){
//火狐
System.out.println("火狐来了...");
}
}
}
request获取请求参数
返回值 | 方法名称 | 方法介绍 |
---|---|---|
String | getParameter(String param) | 根据参数名称获取参数值 username=zs |
String[] | getParameterValues(String param) | 根据参数名称获取参数值们,一般用于获取多选框和下拉列表框的参数值 hobby=‘game’&hobby=‘study’ |
Map<String,String[]> | getParameterMap() | 获取所有参数的map集合 |
Enumeration< String> | getParameterNames() | 获取所有请求的参数名称 |
request解决参数中文乱码问题
GET方式
tomcat 8 已经将get方式乱码问题解决了
POST方式:会乱码
解决:在获取参数前,设置request的编码 request.setCharacterEncoding(“utf-8”);
示例:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决post请求乱码问题
req.setCharacterEncoding("utf-8");
//接收参数
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+" "+password);
}
}
request请求转发
步骤
1.创建转发器对象
RequestDispatcher dispacher = request.getRequestDispacher("要转发的到的目标资源");
2.实现转发
dispacher.forward(request,response);
特点
1.转发以后,浏览器地址栏不会发生变化
2.转发目标资源路径不需要携带虚拟目录
3.转发只能转发当前服务器的内部资源
4.转发是一次请求
request存储域数据
返回值 | 方法名称 | 方法介绍 |
---|---|---|
void | setAttribute(String name,Object name) | 将数据通过键值对的形式存入request域中 |
Object | getAttribute(String name) | 通过键获取request域中存储的数据 |
void | removeAttribute(String name) | 通过键删除request域中存储的数据 |
获取ServletContext
//获取ServletContext域对象
ServletContext servletContext = request.getServletContext();