Java中的request和response理解

Java中的request和response理解
request和response(请求和响应)
1.当Web容器收到客户端的发送过来http请求,会针对每⼀次请求,分别创建⼀个⽤于代表此次请求的HttpServletRequest对象(request)对象、和代表响应的HTTPServletResponse对象(response)。
request负责获取客户机提交过来的数据。
response负责向客户机输出数据。
2.HttpServletRequest请求
GET /Servlet/servlet/Servlet_03 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET C
LR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
getRequestURL⽅法返回客户端发出请求时的完整URL。
getRequestURI⽅法返回请求⾏中的资源名部分。
getQueryString ⽅法返回请求⾏中的参数部分。
getRemoteAddr⽅法返回发出请求的客户机的IP地址
getRemoteHost⽅法返回发出请求的客户机的完整主机名
getRemotePort⽅法返回客户机所使⽤的⽹络端⼝号
getLocalAddr⽅法返回WEB服务器的IP地址。
getLocalName⽅法返回WEB服务器的主机名
在request中可以获取⼀些请求头,这些请求头的案例有:
1.可以⽤来防盗链(Referer头)
防盗链:
有些下载系统的下载地址会有⼀个下载跳转,⽤户在下载页⾯上看到的下载地址可能是 www.abc/down.asp?id=xxxx
有⼈直接将这个地址复制到其他地⽅,即可盗链,直接利⽤下载的地址就可以实现下载,⽽不是通过我⾃⼰的⽹站去下载,这时我们就需要判断下是否是通过我⾃⼰的⽹站点击下载的。
所以我们需要在 down.asp 这个页⾯做下简单的来源判断。如果不是来⾃本站的连接,则直接拒绝访问。
String referer = Header("referer");//获取请求头
//判断这个头是否为空,或这个头的⾸地址是否为localhost,如果不是则重定向
2.获取表单中的信息:
String value = Parameter("name");
在表单提交过来时的中⽂乱码的问题:
*浏览器怎样进⾏URL编码
(1)浏览器对FORM表单中输⼊的中⽂字符都会进⾏URL编码后再传送给WEB服务器。
(2)对于页⾯中的FORM表单中输⼊的内容,浏览器将按照当前显⽰页⾯时所采⽤的字符集编码来进⾏URL编码。
getParameter⽅法的中⽂问题:
(1)getParameter等⽅法在读取的参数信息时,需要进⾏URL解码。
(2)对于HTTP请求消息的请求⾏中的URL地址后的参数,getParameter等⽅法进⾏URL解码时所采⽤的字符集编码在Servlet规范中没有明确规定Tomcat中的ServletReq    uest对象的getParameter等⽅法默认采⽤ISO8859-1字符集编码进⾏URL解码(3)对于POST⽅式下的“application/x-www-form-url
encoded”编码格式的实体内容,getParameter等⽅法以ServletRequest对象的getCharacterEncoding()⽅法返回的字符集编码对其进⾏URL解码。
(4)getCharacterEncoding()⽅法的返回值通常为null,对于这种情况,ServletRequest对象的getParameter等⽅法将使⽤默认的ISO8859-1字符集编码对实体内容中的参数进⾏URL解码,因此也将⽆法返回正确的中⽂参数信息。
(5)ServletRequest接⼝中定义了⼀个setCharacterEncoding⽅法来设置请求消息中的实体内容的字符集编码名称,getParameter⽅法将以该⽅法设置的字符集编码对实体内容进⾏URL解码。
(6)setCharacterEncoding⽅法设置的是请求消息中的实体内容的字符集编码名称,它只影响getParameter⽅法对POST⽅式下的“application/x-www-form-urlencod    ed”编码格式的实体内容进⾏URL解码的结果,⽽不能影响getParameter⽅法对HT 解决⽅案:
1.post⽅式
对于POST⽅式,表单中的参数值对是通过request包发送给服务器,此时浏览器会根据⽹页的ContentType("text/html; charset=GBK")中指定的编码进⾏对表单中的数据进⾏编码,然后发给服务器。
在服务器中根据:request.setCharacterEncoding(""),只要编码跟浏览器⼀直的就可以。
<⽅式
对于GET⽅式,我们知道它的提交是将请求数据附加到URL后⾯作为参数,这样依赖乱码就会很容易出现,因为数据name和value很有可能就是传递的为⾮ASCII码。
当URL拼接后,浏览器对其进⾏encode,然后发送到服务器。具体规则见URL编码规则。
这⾥详细说⼀下encode的过程中容易出现的问题,在这个过程中我们要明⽩需要URL encode的字符⼀般都是⾮ASCII码字符,所以我们就能知道出现乱码主要是URL中附加了中⽂或特殊字符做成的,另⼀个要知道URL encode到底是以什么样的编码完成了URL encode之后URL就成了ASCII范围内的字符了,然后就以iso-8859-1的编码⽅式转换为⼆进制随着请求头⼀起发送出去。
到了服务器之后,⾸先服务器会先⽤iso-8859-1进⾏解码,服务器获取的数据都是ASCII范围内的请求头字符,其中请求URL⾥⾯带有参数数据,如果是中卫或特殊字符,那么encode后的%XY(编码规则中的⼗六进制数)通过request.setCharacterE  String value = new Parameter("name").getBytes("iso-8859-1"),"GBK");
转发:
RequestDispatcher requestDispatcher = RequestDispatcher("/index.jsp");
requestDispatcher.forward(req, resp);
请求重定向和请求转发:是Servlet处理完数据后进⾏页⾯跳转的两种主要⽅式
请求转发:
请求转发是指将请求再转发到另⼀资源(⼀般为JSP或Servlet)。此过程依然在同⼀个请求范围内,转发后浏览器地址栏内
容不变
请求转发使⽤RequestDispatcher接⼝中的forward()⽅法来实现,该⽅法可以把请求转发到另外⼀个资源,并让该资源对浏
览器的请求进⾏响应
请求重定向:
重定向是指页⾯重新定位到某个新地址,之前的请求失效,进⼊⼀个新的请求,且跳转后浏览器地址
栏内容将变为新的指定
地址
重定向是通过HttpServletResponse对象的sendRedirect()来实现,该⽅法相当于浏览器重新发送⼀个请求
//1.请求转发
RequestDispatcher requestDispatcher = RequestDispatcher("/index.jsp");
requestDispatcher.forward(req, resp);
//2.请求重定向:
resp.sendRedirect("localhost:8080/Servlet/servlet/Servlet_03");
区别:
1.使⽤请求重定向,浏览器会向服务器发送两次请求,⽽请求转发则为⼀次请求
2.地址栏显⽰不⼀样请求转发地址栏没有变化,⽽请求重定向地址栏会显⽰新的请求地址
HttpServletResponse.sendRedirect⽅法和RequestDispatcher.forward⽅法的区别:
尽管HttpServletResponse.sendRedirect⽅法和RequestDispatcher.forward⽅法都可以让浏览器获得另外⼀个URL所指向的资源,但
两者的内部运⾏机制有着很⼤的区别。下⾯是HttpServletResponse.sendRedirect⽅法实现的请求重定向与
RequestDispatcher.forward⽅法实现的请求转发的总结⽐较:
(1)RequestDispatcher.forward⽅法只能将请求转发给同⼀个WEB应⽤中的组件;⽽HttpServletResponse.sendRedirect ⽅法不仅
可以重定向到当前应⽤程序中的其他资源,还可以重定向到同⼀个站点上的其他应⽤程序中的资源,甚⾄是使⽤绝对URL重定向到其
他站点的资源。如果传递给HttpServletResponse.sendRedirect ⽅法的相对URL以“/”开头,它是相对于整个WEB站点的根⽬录;如
果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应⽤程序的根⽬录。
(2)调⽤HttpServletResponse.sendRedirect⽅法重定向的访问过程结束后,浏览器地址栏中显⽰的URL会发⽣改变,由初始的URL
地址变成重定向的⽬标URL;⽽调⽤RequestDispatcher.forward ⽅法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变
(3)HttpServletResponse.sendRedirect⽅法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外⼀个URL
的访问请求,这个过程好⽐有个绰号叫“浏览器”的⼈写信张三借钱,张三回信说没有钱,让“浏览器”去李四借,并将李四
现在的通信地址告诉给了“浏览器”。于是,“浏览器”⼜按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览
器”。可见,“浏览器”⼀共发出了两封信和收到了两次回复, “浏览器”也知道他借到的钱出⾃李四之⼿。
RequestDispatcher.forward⽅法在服务器端内部将请求转发给另外⼀个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发⽣了转发⾏为。这个过程好⽐绰号叫“浏览器”的⼈写信张三借钱,张三没有钱,于是张三李四借了⼀些钱,甚⾄还可以加上⾃⼰的⼀些钱,然后再将这些钱汇给了“浏览器”。可见,“浏览器”只发出了⼀封信和收到了⼀次回复,他
只知道从张三那⾥借到了钱,并不知道有⼀部分钱出⾃李四之⼿。
(4)RequestDispatcher.forward⽅法的调⽤者与被调⽤者之间共享相同的request对象和response对象,它们属于同⼀个访问请求
和响应过程;⽽HttpServletResponse.sendRedirect⽅法调⽤者与被调⽤者使⽤各⾃的request对象和response对象,它们属于两个
独⽴的访问请求和响应过程。对于同⼀个WEB应⽤程序的内部资源之间的跳转,特别是跳转之前要对请求进⾏⼀些前期预处理,并要使⽤HttpServletRequest.setAttribute⽅法传递预处理结果,那就应该使⽤RequestDispatcher.forward⽅法。不同WEB应⽤程序之
间的重定向,特别是要重定向到另外⼀个WEB站点上的资源的情况,都应该使⽤HttpServletResponse.sendRedirect⽅法。
(5)⽆论是RequestDispatcher.forward⽅法,还是HttpServletResponse.sendRedirect⽅法,在调⽤它们之前,都不能有内容已经
被实际输出到了客户端。如果缓冲区中已经有了⼀些内容,这些内容将被从缓冲区中清除。
场景应⽤:
请求转发:
⽤于不同应⽤场景
⼀般来讲,在MVC设计模式下,⼀个servlet将数据交给jsp来做显⽰就使⽤请求转发,因为没必要让⽤户
知道内部实现原理,同时对jsp页⾯也可以做保护
重定向:
⽤户登录成功跳转到⾸页⾯是⽤请求重定向,因为此时需要让⽤户明确知道⾃⼰登录成功并跳转到了⾸页
include和forward的区别:
forward会转发到相应的资源中。
⽽include会将包含的资源处理下,之后在处理⾃⼰的页⾯。
例⼦:
[java]
1. ise.always.servlet;
2.
3. import java.io.IOException;
4.
5. import javax.servlet.RequestDispatcher;
6. import javax.servlet.ServletException;
7. import javax.servlet.http.HttpServlet;
8. import javax.servlet.http.HttpServletRequest;
9. import javax.servlet.http.HttpServletResponse;
10. import javax.servlet.http.HttpSession;
11.
12. public class Servlet_05 extends HttpServlet{
13.    private static final long serialVersionUID = 1L;
14.
15.    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
16.            throws ServletException, IOException {
17.        this.doPost(req, resp);
18.    }
19.
20.    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
21.            throws ServletException, IOException {
22.        //1.请求转发
23. //      RequestDispatcher requestDispatcher = RequestDispatcher("/index.jsp");
24. //      requestDispatcher.forward(req, resp);
25. //      requestDispatcher.include(req, resp);
26.
27.        //2.请求重定向:
28. //      resp.sendRedirect("localhost:8080/Servlet/servlet/Servlet_03");
29.
30.        //3.include和forward的区别
31.
32.        RequestDispatcher requestDispatcher = RequestDispatcher("/servlet/Servlet_03");
33.        requestDispatcher.forward(req, resp);
34. //      requestDispatcher.include(req, resp);
35.
36.        OutputStream().write("Servlet_05".getBytes());
37.
38.
39.    }
40. }
include的结果为:servlet_03Servlet_05
forward的结果为:servlet_03
2.HttpServletResponse
acceptlanguageHttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的⽅法。HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Tue, 03 Sep 2013 03:52:13 GMT
但是两则不能结合在⼀起使⽤,原因是:
两个对象的流不⼀样:
getOutputStream:⽅法⽤于返回Servlet引擎创建的字节输出流对象
getWriter:返回Servlet引擎创建的字符输出流对象
这两个⽅法互斥,调⽤了其中的⼀个⽅法之后,就不能在调⽤另外⼀个。
Serlvet的service⽅法结束后,Servlet引擎将检查getWriter或getOutputStream⽅法返回的输出流对象是否已经调⽤过close⽅法,
如果没有,Servlet引擎将调⽤close⽅法关闭该输出流对象。
response的其他功能:
通过setStats⽅法可以设置响应头的状态码
通过setHead⽅法可以设置响应头
常见应⽤
发送REFRESH头,控制浏览器定时刷新⽹页
发送Expires头,控制浏览器禁⽌缓存当前⽂档内容
发送content-type头通知浏览器打开⽂件的⽅式
response.setCharacterEncoding("GBK");
//设置浏览器定时刷新
response.setHeader("refresh", "3");
//设置浏览器禁⽌缓存
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Prama", "no-cache");
//实现⽂件的下载
/
/对于中⽂⽂件名,如果想正常,⼀定要经过url编码
response.setHeader("content-disposition", "attachment;filename=" + de(filename,
"UTF-8"));
[java]
1. ise.always.servlet;
2.
3.
4. import java.io.FileInputStream;
5. import java.io.IOException;
6. import java.io.OutputStream;
7. import java.URLEncoder;
8.
9.
10. import javax.servlet.ServletException;
11. import javax.servlet.http.HttpServlet;
12. import javax.servlet.http.HttpServletRequest;
13. import javax.servlet.http.HttpServletResponse;
14.
15.
16. public class Servlet_06 extends HttpServlet{
17.    private static final long serialVersionUID = 1L;
18.
19.
20.    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
21.            throws ServletException, IOException {
22.        this.doPost(req, resp);
23.    }
24.
25.
26.    protected void doPost(HttpServletRequest req, HttpServletResponse response)
27.            throws ServletException, IOException {
28.        //获取到下载资源的绝对路径getRealPath("e://aa/aa.jpg");
29.        String path = "e://aa/aa.jpg";
30.        String filename = path.substring(path.lastIndexOf("\\")+1);
31.
32.        //对于中⽂⽂件名,如果想正常,⼀定要经过url编码
33.        response.setHeader("content-disposition", "attachment;filename=" + de(filename, "UTF-8"));
34.
35.        FileInputStream in = new FileInputStream(path);
36.        OutputStream out = OutputStream();
37.        try {
38.            int len = 0;
39.            byte buffer[] = new byte[1024];
40.            while ((len = in.read(buffer)) > 0) {
41.                out.write(buffer, 0, len);
42.            }
43.        } finally {
44.            if (in != null)
45.                try {
46.                    in.close();
47.                } catch (Exception e) {
48.                }
49.            ;
50.            if (out != null)
51.                try {
52.                    out.close();
53.                } catch (Exception e) {
54.                }
55.            ;
56.        }
57.
58.    }
59.
60.
61.
62.
63. }
302状态码和location头即可实现重定向
response.setStatus(302);
response.setHeader("location","/Servlet/index.jsp");

本文发布于:2024-09-23 06:26:57,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/371644.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   浏览器   编码   对象   转发   响应
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议