HTTP协议(下)
request请求和response响应
request请求
复制代码
1
2request是服务器就九大内置对象之一,是与请求相关的请求对象。
request的体系结构
复制代码
1
2
3
4
5
6ServletRequest -- 接口 | 继承 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头(防盗链示例)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23@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头(甄别在一次请求中的浏览器信息)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16@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”);
示例:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13@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.创建转发器对象
复制代码
1
2RequestDispatcher dispacher = request.getRequestDispacher("要转发的到的目标资源");
2.实现转发
复制代码
1
2dispacher.forward(request,response);
特点
复制代码
1
2
3
4
5转发以后,浏览器地址栏不会发生变化 转发目标资源路径不需要携带虚拟目录 转发只能转发当前服务器的内部资源 转发是一次请求
request存储域数据
返回值 | 方法名称 | 方法介绍 |
---|---|---|
void | setAttribute(String name,Object name) | 将数据通过键值对的形式存入request域中 |
Object | getAttribute(String name) | 通过键获取request域中存储的数据 |
void | removeAttribute(String name) | 通过键删除request域中存储的数据 |
获取ServletContext
复制代码
1
2
3//获取ServletContext域对象 ServletContext servletContext = request.getServletContext();
response响应
响应状态码(状态码都是3位数)
复制代码
1
2
3
4
5
6
7
8
91xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码 2xx:成功。代表:200 3xx:重定向。代表:302(重定向),304(访问缓存) 4xx:客户端错误。 * 代表: * 404(请求路径没有对应的资源) * 405:请求方式没有对应的doXxx方法 5xx:服务器端错误。代表:500(服务器内部出现异常)
常见的响应头
复制代码
1
2
3
4
5Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式 Content-disposition:服务器告诉客户端以什么格式打开响应体数据 * in-line:默认值,在当前页面内打开 * attachment;filename=xxx:以附件形式打开响应体。文件下载
response响应对象常用到的方法
返回值 | 方法名称 | 方法介绍 |
---|---|---|
void | setStatus(int sc) | 设置响应的状态码 |
void | setHeader(String name, String value) | 设置响应头 |
PrintWriter | getWriter() | 获取字符输出流 |
OutoutStream | getOutoutStream() | 获取字节输出流 |
案例:使用输出流,将数据输出到客户端浏览器
复制代码
1
2
3
4
5
6
7
8
9
10@WebServlet("/demo1") public class ResponseServletDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //字节流输出 //response.getOutputStream().println("hello response"); // 字符流输出 response.getWriter().println("hello response"); } }
response对象的重定向
重定向的特点
复制代码
1
2
3
4
5完成重定向后,浏览器的地址栏会发生变化; 重定向是两次请求; 重定向不仅可以访问当前服务器内部资源,也可以访问其他服务器的资源; 重定向时需要在重定向的资源路径上携带虚拟目录
response乱码问题的处理
步骤:
1.设置该流的默认编码
2.告诉浏览器响应体使用的编码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18示例: @WebServlet("/demo1") public class ResponseServletDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 设置流的编码 //response.setCharacterEncoding("utf-8"); //2. 设置响应数据的格式 //response.setHeader("content-type","text/html;charset=utf-8"); //以下一行代码顶上面二行代码 response.setContentType("text/html;charset=utf-8"); // 1. 获取字符流输出 PrintWriter writer = response.getWriter(); //2. 输出塑聚到客户端 writer.println("我爱你JAVA....."); }
JAVAEE中提供了简化的方法。
复制代码
1
2
3//设置响应编码方式 response.setContentType("html/text;charset=utf-8");
最后
以上就是活力大船最近收集整理的关于HTTP协议(下)的全部内容,更多相关HTTP协议(下)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复