服务器端--Http请求及服务器响应
2017-01-04 12:15
155 查看
Servlet 客户端 HTTP请求
一个完整的请求信息主要包括:状态行,请求头和请求实体。
当浏览器请求网页时,它会向Web服务器发送特定信息,这些信息作为请求头中的一部分进行传输。
常用的请求头包括:
1、accept:浏览器可接受的MIME(数据类型)类型。
2、Accept- Charset:浏览器可接受的字符集。
3、Accept- Encoding:浏览器进行解码的数据编码方式。
4、Accept–Language:浏览器所希望的语言种类。
5、Connection:是否需要持久连接。
注:每次连接完成发送请求,当此次请求完成后就会断开连接,但有时我们希望发送多次请求,这样就需要保持持久连接。
6、Content-Length:请求消息正文的长度。
7、Host:初始化URL中的主机端口。
8、Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求页面。
注:Referer主要用于防止资源信息被盗用的情况。
9、Use–Agent:浏览器类型,当Servlet返回的内容与浏览器类型有关时会用到该消息头。
读取请求头常用的一些方法:
1、Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。
2、HttpSession getSession()
返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。
3、Enumeration getHeaderNames()
返回一个枚举,包含在该请求中包含的所有的头名。
4、HttpSession getSession(boolean create)
返回与该请求关联的当前 HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。
5、Object getAttribute(String name)
以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。
6、String getCharacterEncoding()
返回请求主体中使用的字符编码的名称。
7、String getContentType()
返回请求主体的 MIME 类型,如果不知道类型则返回 null。
8、String getContextPath()
返回指示请求上下文的请求 URI 部分。
9、String getHeader(String name)
以字符串形式返回指定的请求头的值。
10、String getParameter(String name)
以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。
11、String getProtocol()
返回请求协议的名称和版本。
代码示例:
public class TestHttpRequest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
String title = "测试HTTP请求";
String doctype = "<!DOCTYPE HTML> \n";
PrintWriter out = resp.getWriter();
out.println(doctype +
"<html> \n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<table width=\"80%\" border=\"1\" align=\"center\">\n" +
"<caption>" + title + "</caption>" +
"<tr bgcolor=\"#949494\">\n" +
"<th>Header 名称</th><th>Header 值</th>\n" +
"</tr> \n");
Enumeration headerNames = req.getHeaderNames();
while(headerNames.hasMoreElements()){
String paramName = (String)headerNames.nextElement();
out.println("<tr><td>" + paramName + "</td>\n");
String paramValue = req.getHeader(paramName);
out.print("<td>" + paramValue + "</td></tr>");
}
out.println("</table>\n</body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req,resp);
}
}
web.xml配置文件:
<web-app>
<servlet>
<servlet-name>HttpRequest</servlet-name>
<servlet-class>com.Servlet.TestHttpRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HttpRequest</servlet-name>
<url-pattern>/testHttpRequest</url-pattern>
</servlet-mapping>
</web-app>
调用上面的servlet,访问http://localhost:8080/Servlet/testHttpRequest,得到如下结果:
测试HTTP请求
Servlet 服务器 HTTP 响应
当一个 Web服务器响应一个 HTTP请求时,响应通常包括一个状态行、一些响应报头、一个空行和文档。一个典型的响应如下所示:
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
状态行包括 HTTP版本(在本例中为HTTP/1.1)、一个状态码(在本例中为 200)和一个对应于状态码的短消息(在本例中为 OK)。
在消息头中存在着请求与响应通用的消息头,我们称之为通用消息头,在这里不做阐述,我们只介绍一些响应中特有的消息头.
常用的如下:
1、Allow:服务器支持哪些请求方法(get、post等)
2、Location:这个头信息应被包含在所有的带有状态码的响应中。在 300s内,这会通知浏览器文档的地址。浏览器会自动重新连接到这个位置,并获取新的文档。
3、Refresh:浏览器过多少秒后自动刷新页面
4、Content-type:实体文档的MIME(Multipurpose Internet Mail Extension)类型
5、Content-Length:返回实体内容的长度
6、Last–Modified:文档的最后改动时间
设置HTTP响应报头的方法:
1、String encodeURL(String url)
对包含 session会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
2、booleanisCommitted()
返回一个布尔值,指示响应是否已经提交。
3、void addCookie(Cookie cookie)
把指定的 cookie 添加到响应。
4、void addHeader(String name, String value)
添加一个带有给定的名称和值的响应报头。
5、void reset()
清除缓冲区中存在的任何数据,包括状态码和头。
6、void setCharacterEncoding(String charset)
设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
7、void setContentType(String type)
如果响应还未被提交,设置被发送到客户端的响应的内容类型。
8、void setHeader(String name, String value)
设置一个带有给定的名称和值的响应报头。
代码示例:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置请求编码格式
request.setCharacterEncoding("utf-8");
//设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
String title = "测试服务器响应--自动刷新";
String doctype = "<!DOCTYPE html>\n";
//获取输出流
PrintWriter out = response.getWriter();
out.println(doctype +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<body bgcolor=\"#f0f0f0\">\n");
//设置10秒钟进行一次页面刷新
response.setIntHeader("Refresh",10);
//获取当前时间
Date date = new Date();
//设置显示的格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime = dateFormat.format(date);
out.println("<p> 现在的时间: " + nowTime + "</p>" );
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
web.xml文件配置:
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>TestHttpResponse</servlet-name>
<servlet-class>com.Servlet.TestHttpResponse</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestHttpResponse</servlet-name>
<url-pattern>/testHttpResponse</url-pattern>
</servlet-mapping>
调用上面的servlet后,访问http://localhost:8080/Servlet/testHttpResponse,得到如下结果:
一个完整的请求信息主要包括:状态行,请求头和请求实体。
当浏览器请求网页时,它会向Web服务器发送特定信息,这些信息作为请求头中的一部分进行传输。
常用的请求头包括:
1、accept:浏览器可接受的MIME(数据类型)类型。
2、Accept- Charset:浏览器可接受的字符集。
3、Accept- Encoding:浏览器进行解码的数据编码方式。
4、Accept–Language:浏览器所希望的语言种类。
5、Connection:是否需要持久连接。
注:每次连接完成发送请求,当此次请求完成后就会断开连接,但有时我们希望发送多次请求,这样就需要保持持久连接。
6、Content-Length:请求消息正文的长度。
7、Host:初始化URL中的主机端口。
8、Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求页面。
注:Referer主要用于防止资源信息被盗用的情况。
9、Use–Agent:浏览器类型,当Servlet返回的内容与浏览器类型有关时会用到该消息头。
读取请求头常用的一些方法:
1、Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。
2、HttpSession getSession()
返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。
3、Enumeration getHeaderNames()
返回一个枚举,包含在该请求中包含的所有的头名。
4、HttpSession getSession(boolean create)
返回与该请求关联的当前 HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。
5、Object getAttribute(String name)
以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。
6、String getCharacterEncoding()
返回请求主体中使用的字符编码的名称。
7、String getContentType()
返回请求主体的 MIME 类型,如果不知道类型则返回 null。
8、String getContextPath()
返回指示请求上下文的请求 URI 部分。
9、String getHeader(String name)
以字符串形式返回指定的请求头的值。
10、String getParameter(String name)
以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。
11、String getProtocol()
返回请求协议的名称和版本。
代码示例:
public class TestHttpRequest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
String title = "测试HTTP请求";
String doctype = "<!DOCTYPE HTML> \n";
PrintWriter out = resp.getWriter();
out.println(doctype +
"<html> \n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<table width=\"80%\" border=\"1\" align=\"center\">\n" +
"<caption>" + title + "</caption>" +
"<tr bgcolor=\"#949494\">\n" +
"<th>Header 名称</th><th>Header 值</th>\n" +
"</tr> \n");
Enumeration headerNames = req.getHeaderNames();
while(headerNames.hasMoreElements()){
String paramName = (String)headerNames.nextElement();
out.println("<tr><td>" + paramName + "</td>\n");
String paramValue = req.getHeader(paramName);
out.print("<td>" + paramValue + "</td></tr>");
}
out.println("</table>\n</body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req,resp);
}
}
web.xml配置文件:
<web-app>
<servlet>
<servlet-name>HttpRequest</servlet-name>
<servlet-class>com.Servlet.TestHttpRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HttpRequest</servlet-name>
<url-pattern>/testHttpRequest</url-pattern>
</servlet-mapping>
</web-app>
调用上面的servlet,访问http://localhost:8080/Servlet/testHttpRequest,得到如下结果:
测试HTTP请求
Header 名称 | Header 值 |
---|---|
accept | image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */* |
accept-language | zh-CN |
user-agent | Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; UBrowser/6.0.1121.207) |
accept-encoding | gzip, deflate |
host | localhost:8080 |
connection | Keep-Alive |
当一个 Web服务器响应一个 HTTP请求时,响应通常包括一个状态行、一些响应报头、一个空行和文档。一个典型的响应如下所示:
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
状态行包括 HTTP版本(在本例中为HTTP/1.1)、一个状态码(在本例中为 200)和一个对应于状态码的短消息(在本例中为 OK)。
在消息头中存在着请求与响应通用的消息头,我们称之为通用消息头,在这里不做阐述,我们只介绍一些响应中特有的消息头.
常用的如下:
1、Allow:服务器支持哪些请求方法(get、post等)
2、Location:这个头信息应被包含在所有的带有状态码的响应中。在 300s内,这会通知浏览器文档的地址。浏览器会自动重新连接到这个位置,并获取新的文档。
3、Refresh:浏览器过多少秒后自动刷新页面
4、Content-type:实体文档的MIME(Multipurpose Internet Mail Extension)类型
5、Content-Length:返回实体内容的长度
6、Last–Modified:文档的最后改动时间
设置HTTP响应报头的方法:
1、String encodeURL(String url)
对包含 session会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
2、booleanisCommitted()
返回一个布尔值,指示响应是否已经提交。
3、void addCookie(Cookie cookie)
把指定的 cookie 添加到响应。
4、void addHeader(String name, String value)
添加一个带有给定的名称和值的响应报头。
5、void reset()
清除缓冲区中存在的任何数据,包括状态码和头。
6、void setCharacterEncoding(String charset)
设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
7、void setContentType(String type)
如果响应还未被提交,设置被发送到客户端的响应的内容类型。
8、void setHeader(String name, String value)
设置一个带有给定的名称和值的响应报头。
代码示例:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置请求编码格式
request.setCharacterEncoding("utf-8");
//设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
String title = "测试服务器响应--自动刷新";
String doctype = "<!DOCTYPE html>\n";
//获取输出流
PrintWriter out = response.getWriter();
out.println(doctype +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<body bgcolor=\"#f0f0f0\">\n");
//设置10秒钟进行一次页面刷新
response.setIntHeader("Refresh",10);
//获取当前时间
Date date = new Date();
//设置显示的格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime = dateFormat.format(date);
out.println("<p> 现在的时间: " + nowTime + "</p>" );
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
web.xml文件配置:
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>TestHttpResponse</servlet-name>
<servlet-class>com.Servlet.TestHttpResponse</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestHttpResponse</servlet-name>
<url-pattern>/testHttpResponse</url-pattern>
</servlet-mapping>
调用上面的servlet后,访问http://localhost:8080/Servlet/testHttpResponse,得到如下结果:
测试服务器响应--自动刷新
现在的时间: 2017-01-04 13:31:21相关文章推荐
- 我的Android进阶之旅------>Android发送GET和POST以及HttpClient发送POST请求给服务器响应
- 通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分)
- Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误。
- java 写的能够响应浏览器请求的 http 服务器
- [置顶] 【web】HTTP状态返回码介绍,客户端请求服务器端,服务器返回状态码的含义介绍整理。
- Tomcat服务器与Http协议之请求(get请求、post请求)和响应
- 客户端与服务器端交互原理(HTTP数据请求与HTTP响应)
- tomcat服务器与Http协议之请求(get请求、post请求)和响应
- 接收对 http://192.168.1.18:8001/ObtainData/Service 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。
- 通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分)
- 通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分
- HttpURLConnection 向服务器发送post和get请求 并接收响应
- HTTP要点概述:三,客户端和服务器,请求和响应
- 通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分)
- JSP客户端请求、JSP服务器响应、JSP HTTP 状态码
- 通过URL,使用HttpURLConnection进行请求/响应,访问web服务器图片等资源。异常报错
- 通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分)
- Http之客户端请求服务器,服务器响应客户端。通过Handler在主线程中读取数据
- 我的Android进阶之旅------>Android发送GET和POST以及HttpClient发送POST请求给服务器响应
- Android发送GET和POST以及HttpClient发送POST请求给服务器响应