您的位置:首页 > 理论基础 > 计算机网络

服务器端--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请求

测试HTTP请求
Header 名称Header 值
acceptimage/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*
accept-languagezh-CN
user-agentMozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; UBrowser/6.0.1121.207)
accept-encodinggzip, deflate
hostlocalhost:8080
connectionKeep-Alive
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,得到如下结果:

测试服务器响应--自动刷新

现在的时间: 2017-01-04 13:31:21
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐