首先需要了解浏览器访问Servlet的过程:
Web服务器接收到请求后会创建HttpServletResponse对象和HttpServletRequest对象,并将它们作为参数传递给service()调用。
HttpServletResponse对象
HttpServletResponse接口继承自ServletResponse接口,专门用于封装HTTP响应消息。HTTP响应消息分为状态行,响应消息头,消息体三部分。
- 发送状态码
setStatus(int status)
方法:用于设置HTTP响应消息的状态码,并生成响应状态行。Web服务器默认产生一个状态码为200的状态行。sendError(int code, String message)
方法:用于发送错误信息的状态码和提示说明信息,例如404表示找不到资源。
- 发送响应消息头
addHeader(String name, String value)
方法:用于设置Http响应头字段。add可改为set,追加变覆盖。带Int方便值为intsetContentLength(int len)
方法:用于设置响应消息的实体内容大小,单位字节。setContentType(String type)
方法:用于设置Servlet输出内容的类型,例如:”image/jpeg”。如果内容为文本还可以设置字符编码。setCharacterEncoding(String charset)
方法:用于设置输出内容使用的字符编码。
- 发送响应消息体
getOutputStream()
方法:可以直接输出字节数组中的二进制数据。getWriter()
方法:获取的字符输出流对象为PrintWriter类型,可直接输出字符文本内容。
HttpServletResponse应用
- 解决中文输出乱码问题:使用
setContentType(String type)
方法设置输出类型并设置编码。
response.setContentType("text/html;charset=utf-8");
- 实现页面定时刷新并跳转:HTTP协议中,定义了一个Refresh头字段,可以通知浏览器在指定时间后自动刷新并跳转页面。
//2秒后跳转到百度
response.setHeader("Refresh","2;URL=http://www.baidu.com/");
- 实现请求重定向:使用
sendRedirect(String location)
方法,生成302响应码和location响应头,用于通知客户端重新访问其他映射路径。
response.sendRedirect("/xxx");
HttpServletRequest对象
HttpServletRequest接口继承自ServletRequest接口,专门用于封装HTTP请求消息。HTTP请求消息分为请求行,请求消息头,消息体三部分。
- 获取请求行
getMethod()
方法:用于获取请求方式,Get或Post等getRequestURL()
方法:返回StringBuffer类型,获取客户端发出请求的完整URL,包括协议,服务器名,端口号,资源路径等,不包括参数。- 获取客户端发出请求的URL各个部分:
- 获取请求头
getHeader()
方法:获取指定头字段的值,没有返回null,有多个返回第一个(返回全部使用getHeaders()
)getHeaderNames()
方法:获取一个包含所有请求头字段的Enumeration对象getContextType()|getContextLength()|getCharacterEncoding()
方法:获取Context-Type|Context-Length|消息实体的字符编码。
- 获取请求参数
请求体是一种报文体,用来放请求参数的。Post请求提交表单时,会将键值对存放到请求体中。而Get一般直接将请求参数直接放在URL的?号后面。
getParameter(String name)
方法:获取指定名称的参数值,没有包含指定名称返回null,没有设值返回空串,包含多个参数返回第一个。getParameterValues(String name)
方法:获取同一个参数名称所对应的所有参数值。getParameterNames()
方法:获取包含所有参数名的Enumeration对象getParameterMap()
方法:用于将请求消息中的所有参数名和值装进一个Map对象返回。
HttpServletRequest应用
- 利用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接口
- 获取RequestDispatcher对象:使用
request.getRequestDispatcher(String path);
返回封装了指定web资源的RequestDispatcher对象。
RequestDispatcher dispatcher = req.getRequestDispatcher("/Demo.html");
- 请求转发:使用
forward()
方法,将请求从一个Servlet传递到另一个Web资源。
dispatcher.forward(req,resp);
- 请求包含:使用
include()
方法,用于将其他资源作为当前响应的内容包含进来。
dispatcher.include(req,resp);
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/276895.html