Servlet_请求与响应

首先需要了解浏览器访问Servlet的过程:

Web服务器接收到请求后会创建HttpServletResponse对象和HttpServletRequest对象,并将它们作为参数传递给service()调用。

HttpServletResponse对象

HttpServletResponse接口继承自ServletResponse接口,专门用于封装HTTP响应消息。HTTP响应消息分为状态行,响应消息头,消息体三部分。

  1. 发送状态码
  • setStatus(int status)方法:用于设置HTTP响应消息的状态码,并生成响应状态行。Web服务器默认产生一个状态码为200的状态行。
  • sendError(int code, String message)方法:用于发送错误信息的状态码和提示说明信息,例如404表示找不到资源。
  1. 发送响应消息头
  • addHeader(String name, String value)方法:用于设置Http响应头字段。add可改为set,追加变覆盖。带Int方便值为int
  • setContentLength(int len)方法:用于设置响应消息的实体内容大小,单位字节。
  • setContentType(String type)方法:用于设置Servlet输出内容的类型,例如:"image/jpeg"。如果内容为文本还可以设置字符编码。
  • setCharacterEncoding(String charset)方法:用于设置输出内容使用的字符编码。
  1. 发送响应消息体
  • getOutputStream()方法:可以直接输出字节数组中的二进制数据。
  • getWriter()方法:获取的字符输出流对象为PrintWriter类型,可直接输出字符文本内容。

HttpServletResponse应用

  1. 解决中文输出乱码问题:使用setContentType(String type)方法设置输出类型并设置编码。
response.setContentType("text/html;charset=utf-8");
  1. 实现页面定时刷新并跳转:HTTP协议中,定义了一个Refresh头字段,可以通知浏览器在指定时间后自动刷新并跳转页面。
//2秒后跳转到百度
response.setHeader("Refresh","2;URL=http://www.baidu.com/");
  1. 实现请求重定向:使用sendRedirect(String location)方法,生成302响应码和location响应头,用于通知客户端重新访问其他映射路径。
response.sendRedirect("/xxx");

HttpServletRequest对象

HttpServletRequest接口继承自ServletRequest接口,专门用于封装HTTP请求消息。HTTP请求消息分为请求行,请求消息头,消息体三部分。

  1. 获取请求行
  • getMethod()方法:用于获取请求方式,Get或Post等
  • getRequestURL()方法:返回StringBuffer类型,获取客户端发出请求的完整URL,包括协议,服务器名,端口号,资源路径等,不包括参数。
  • 获取客户端发出请求的URL各个部分:
  1. 获取请求头
  • getHeader()方法:获取指定头字段的值,没有返回null,有多个返回第一个(返回全部使用getHeaders()
  • getHeaderNames()方法:获取一个包含所有请求头字段的Enumeration对象
  • getContextType()|getContextLength()|getCharacterEncoding()方法:获取Context-Type|Context-Length|消息实体的字符编码。
  1. 获取请求参数
    请求体是一种报文体,用来放请求参数的。Post请求提交表单时,会将键值对存放到请求体中。而Get一般直接将请求参数直接放在URL的?号后面。
  • getParameter(String name)方法:获取指定名称的参数值,没有包含指定名称返回null,没有设值返回空串,包含多个参数返回第一个。
  • getParameterValues(String name)方法:获取同一个参数名称所对应的所有参数值。
  • getParameterNames()方法:获取包含所有参数名的Enumeration对象
  • getParameterMap()方法:用于将请求消息中的所有参数名和值装进一个Map对象返回。

HttpServletRequest应用

  1. 利用Referer请求头防止"盗链"
    Referer表示请求当前资源的客户端来源,例如说:在B站有一个P站的链接,当张三点击链接跳转到P站时,浏览器向P站发送的请求中会包含referer头字段,告诉P站这个张三是从B站来的。
    我们可以用Referer请求头来防止其他网站将下载链接指向我们网站的资源,判断请求地址和来源地址不一样就不让他下载。
String referer = request.getHeader("referer");       // 获取请求来源
String sitePart = "http://"+request.getServerName();    // 获取访问地址
// 判断referer是否为空,且首地址是否以sitePart开始
if(referer!=null && referer.startsWith(sitePart)){
    // 允许下载资源...
}else{
    // 禁止下载资源...
}

解决请求参数中文乱码问题

  • 使用setCharacterEncoding()方法,设置request对象的解码方式。这种方法只对Post请求有效,对Get请求无效。
request.setCharacterEncoding("utf-8");
  • 使用重新编码的方式,解决Get方式提交表单时出现中文乱码问题。
name = new String(name.getBytes("iso8859-1"),"utf-8");
  • 通过配置Tomcat解决Get提交方式的中文乱码问题(了解即可。不推荐使用)
    server.xml文件中的Connector节点下增加一个useBodyEncodingForURL属性,设置值为true,并在程序中调用reponse.setCharacterEncoding("GBK");使编码方式和消息体一致,从而解决问题。

RequestDispatcher接口

  1. 获取RequestDispatcher对象:使用request.getRequestDispatcher(String path);返回封装了指定web资源的RequestDispatcher对象。
RequestDispatcher dispatcher = req.getRequestDispatcher("/Demo.html");
  1. 请求转发:使用forward()方法,将请求从一个Servlet传递到另一个Web资源。
dispatcher.forward(req,resp);
  1. 请求包含:使用include()方法,用于将其他资源作为当前响应的内容包含进来。
dispatcher.include(req,resp);
posted @ 2022-07-25 15:23  独游空想家  阅读(101)  评论(0编辑  收藏  举报