HTTP协议中,如何实现web服务的重定向、跳转与请求转发机制?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1608个文字,预计阅读时间需要7分钟。
在JavaWeb中,HttpServletRequest与HttpServletResponse是处理各种请求与操作必备的参数。与原始的ServletRequest/ServletResponse相比,它们更符合HTTP协议,首先从HTTP协议入手,回顾一些基本内容。
JavaWeb中,HttpServletRequest与HttpServletResponse几乎是处理各种请求与操作必备的参数,与原始的ServletRequest/ServletResponse相比,它们符合HTTP协议,所以首先从localhost:8080/demo/1.html?username=jack&password=1234;如果是POST请求,则会单独讲请求内容放入请求体中。由于url的长度有限制,所以GET请求追加的内容也有限制,一般为1024字节(1k),但POST的请求体大小没有限制。
请求头的常用内容:
Accept: text/html,image/* --支持数据类型
Accept-Charset: ISO-8859-1 --字符集
Accept-Encoding: gzip --支持压缩格式
Accept-Language:zh-cn --语言环境
Host:www.***.com:80 --访问主机
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --缓存时间
Referer:www.***.com/index.jsp--来自哪个页面、防盗链 – 如果没有通过超链接访问2.html返回null
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 用户数据
Cookie --表示cookie技术
Connection: close/Keep-Alive --链接状态
Date: Tue, 11 Jul 2000 18:23:51 GMT --时间
另外,MIME表示Multipurpose Internet Mail Extensions(多用途互联网邮件扩展),包括以下常见内容:
格式:大类型/小类型;参数
大类型:分7类,表示互联网所有资源。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;
Message:用于包装一个E-mail消息;
Image:用于传输静态图片数据;
Audio:用于传输音频或者音声数据;
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
例如:
text/css css文件
text/html html文件
text/javascript js文件
image/* 所有图片
image/jpeg jpg图片
----------------------------------------------------------------------------------------------->
请求的响应也分为响应行,响应头以及响应体。格式为:"协议/版本状态码状态码对应描述信息"。
状态码:
1xx: 服务器响应浏览器,数据正在发送中。一般使用很少。
2xx: 服务器响应浏览器已经正常结束。 常用:200 表示正常。
3xx: 服务器响应浏览器,请求还没有完成,需要浏览器进一步操作,来完成整个请求。
常用状态码:
302 (307):与响应头location 结合完成页面重新跳转。
304:页面读取缓存
4xx: 服务器响应浏览器,浏览器操作有误。
常见:404 页面找不到。(一般请求页面找不到表示用户URL写错)
5xx: 服务器响应浏览器,服务器异常
响应头:
Location:www.it315.org/index.jsp--跳转方向
Server:apache tomcat --服务器型号
Content-Encoding: gzip --数据压缩
Content-Length: 80 --数据长度
Content-Language: zh-cn --语言环境
Content-Type: text/html; charset=GB2312 --数据类型
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --最后修改时间
Refresh: 1;url=www.it315.org--定时刷新
Content-Disposition: attachment; filename=aaa.zip --下载
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Expires: -1 --缓存
Cache-Control: no-cache --缓存
Pragma: no-cache --缓存
Connection: close/Keep-Alive --连接
Date: Tue, 11 Jul 2000 18:23:51 GMT --时间
----------------------------------------------------------------------------------------------->
以上属于www.changjiang.com/TestServlet"); /** *方式二:更为简便 */ response.sendRedirect("www.changjiang.com/TestServlet");
页面刷新所需要携带的报文内容,其实这个使用的场景也是蛮多的:
/** * 跳转 --两次都是200 (有可能第二个304 读取浏览器缓存) * 格式:秒 --> 指定秒数刷新当前页面 * 格式:秒;url="" --> 指定秒之后跳转到指定的url */ response.setHeader("refresh", "2"); response.setHeader("refresh", "0;url=1.html");来看一些用到页面刷新的实例:
private void test1(HttpServletResponse response) throws IOException { response.setHeader("refresh", "3"); String data = new Random().nextInt(100000)+""; response.getWriter().write(data); } private void test2(HttpServletResponse response) throws IOException { response.setHeader("refresh", "3;url='/day06/index.jsp'"); response.setContentType("text/html;charset=GB2312"); response.getWriter().write("登录成功,将在3秒后跳转,如果没有,请点<a href='xxx'>超链接</a>"); }最后看下服务器内部进行的请求转发,首选要获得转发的RequestDispatcher,
当前servlet路径: localhost:8080/day08/a/b/Demo01Servlet另一个servlet路径:localhost:8080/day08/a/b/Demo02Servlet
ServletRequest (常用) request.getRequestDispatcher("Demo02Servlet") request.getRequestDispatcher("/a/b/Demo02Servlet") --注意:没有day08 , (扩展:对比重定向) ServletContext this.getServletContext().getRequestDispatcher("/a/b/Demo02Servlet ")
接着需要指定请求转发还是请求包含:
forward(ServletRequest request, ServletResponse response) 请求转发 A 转发 B,只输出B内容到浏览器。(如果A没有数据发送 response.isComitted=false,将清空缓存) 请求转发只输出最后一个servlet内容 如果 isCommitted=true,在进行forward将抛异常。一般情况如果输出少量的数据,认为isCommitted=falseinclude(ServletRequest request, ServletResponse response) 请求包含 A 包含 B,先输出A内容到浏览器,在输出B的内容到浏览器。 请求包含,输出所有servlet 汇总后的内容。
在使用请求转发时,一个request涉及到了多个servlet的资源,属于跨域操作,需要特别注意各个资源内的编码一致性,所以一般servlet中需要加入以下两行代码,保证资源编码一致:
request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");最后总结一下请求转发的特点:
- 请求路径没有改变,但可以涉及服务器端多个资源
- 可以在一次请求中,共享request作用域的数据
- 一次请求,使用请求转发,tomcat将创建两个request和一个response对象,两个request对象数据相同的(可以理解成对象被克隆了)
本文共计1608个文字,预计阅读时间需要7分钟。
在JavaWeb中,HttpServletRequest与HttpServletResponse是处理各种请求与操作必备的参数。与原始的ServletRequest/ServletResponse相比,它们更符合HTTP协议,首先从HTTP协议入手,回顾一些基本内容。
JavaWeb中,HttpServletRequest与HttpServletResponse几乎是处理各种请求与操作必备的参数,与原始的ServletRequest/ServletResponse相比,它们符合HTTP协议,所以首先从localhost:8080/demo/1.html?username=jack&password=1234;如果是POST请求,则会单独讲请求内容放入请求体中。由于url的长度有限制,所以GET请求追加的内容也有限制,一般为1024字节(1k),但POST的请求体大小没有限制。
请求头的常用内容:
Accept: text/html,image/* --支持数据类型
Accept-Charset: ISO-8859-1 --字符集
Accept-Encoding: gzip --支持压缩格式
Accept-Language:zh-cn --语言环境
Host:www.***.com:80 --访问主机
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --缓存时间
Referer:www.***.com/index.jsp--来自哪个页面、防盗链 – 如果没有通过超链接访问2.html返回null
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 用户数据
Cookie --表示cookie技术
Connection: close/Keep-Alive --链接状态
Date: Tue, 11 Jul 2000 18:23:51 GMT --时间
另外,MIME表示Multipurpose Internet Mail Extensions(多用途互联网邮件扩展),包括以下常见内容:
格式:大类型/小类型;参数
大类型:分7类,表示互联网所有资源。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;
Message:用于包装一个E-mail消息;
Image:用于传输静态图片数据;
Audio:用于传输音频或者音声数据;
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
例如:
text/css css文件
text/html html文件
text/javascript js文件
image/* 所有图片
image/jpeg jpg图片
----------------------------------------------------------------------------------------------->
请求的响应也分为响应行,响应头以及响应体。格式为:"协议/版本状态码状态码对应描述信息"。
状态码:
1xx: 服务器响应浏览器,数据正在发送中。一般使用很少。
2xx: 服务器响应浏览器已经正常结束。 常用:200 表示正常。
3xx: 服务器响应浏览器,请求还没有完成,需要浏览器进一步操作,来完成整个请求。
常用状态码:
302 (307):与响应头location 结合完成页面重新跳转。
304:页面读取缓存
4xx: 服务器响应浏览器,浏览器操作有误。
常见:404 页面找不到。(一般请求页面找不到表示用户URL写错)
5xx: 服务器响应浏览器,服务器异常
响应头:
Location:www.it315.org/index.jsp--跳转方向
Server:apache tomcat --服务器型号
Content-Encoding: gzip --数据压缩
Content-Length: 80 --数据长度
Content-Language: zh-cn --语言环境
Content-Type: text/html; charset=GB2312 --数据类型
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --最后修改时间
Refresh: 1;url=www.it315.org--定时刷新
Content-Disposition: attachment; filename=aaa.zip --下载
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Expires: -1 --缓存
Cache-Control: no-cache --缓存
Pragma: no-cache --缓存
Connection: close/Keep-Alive --连接
Date: Tue, 11 Jul 2000 18:23:51 GMT --时间
----------------------------------------------------------------------------------------------->
以上属于www.changjiang.com/TestServlet"); /** *方式二:更为简便 */ response.sendRedirect("www.changjiang.com/TestServlet");
页面刷新所需要携带的报文内容,其实这个使用的场景也是蛮多的:
/** * 跳转 --两次都是200 (有可能第二个304 读取浏览器缓存) * 格式:秒 --> 指定秒数刷新当前页面 * 格式:秒;url="" --> 指定秒之后跳转到指定的url */ response.setHeader("refresh", "2"); response.setHeader("refresh", "0;url=1.html");来看一些用到页面刷新的实例:
private void test1(HttpServletResponse response) throws IOException { response.setHeader("refresh", "3"); String data = new Random().nextInt(100000)+""; response.getWriter().write(data); } private void test2(HttpServletResponse response) throws IOException { response.setHeader("refresh", "3;url='/day06/index.jsp'"); response.setContentType("text/html;charset=GB2312"); response.getWriter().write("登录成功,将在3秒后跳转,如果没有,请点<a href='xxx'>超链接</a>"); }最后看下服务器内部进行的请求转发,首选要获得转发的RequestDispatcher,
当前servlet路径: localhost:8080/day08/a/b/Demo01Servlet另一个servlet路径:localhost:8080/day08/a/b/Demo02Servlet
ServletRequest (常用) request.getRequestDispatcher("Demo02Servlet") request.getRequestDispatcher("/a/b/Demo02Servlet") --注意:没有day08 , (扩展:对比重定向) ServletContext this.getServletContext().getRequestDispatcher("/a/b/Demo02Servlet ")
接着需要指定请求转发还是请求包含:
forward(ServletRequest request, ServletResponse response) 请求转发 A 转发 B,只输出B内容到浏览器。(如果A没有数据发送 response.isComitted=false,将清空缓存) 请求转发只输出最后一个servlet内容 如果 isCommitted=true,在进行forward将抛异常。一般情况如果输出少量的数据,认为isCommitted=falseinclude(ServletRequest request, ServletResponse response) 请求包含 A 包含 B,先输出A内容到浏览器,在输出B的内容到浏览器。 请求包含,输出所有servlet 汇总后的内容。
在使用请求转发时,一个request涉及到了多个servlet的资源,属于跨域操作,需要特别注意各个资源内的编码一致性,所以一般servlet中需要加入以下两行代码,保证资源编码一致:
request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");最后总结一下请求转发的特点:
- 请求路径没有改变,但可以涉及服务器端多个资源
- 可以在一次请求中,共享request作用域的数据
- 一次请求,使用请求转发,tomcat将创建两个request和一个response对象,两个request对象数据相同的(可以理解成对象被克隆了)

