response代表服务器对客户端的响应。大部分时候,程序无需使用response来响应客户端请求,因为有个更简单的响应对象——out,它代表页面输出流,直接使用out生成响应更简单。
但out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,无法输出非字符内容。假如需要在JSP页面动态生成一副位图、或者一个PDF文档,使用out作为相应对象将无法完成,此时需要response作为响应输出。
除此之外,还可以使用response来重定向请求,以及用于客户端增加Cookie。
response.sendRedirect("path") 重定向网页 response.setHeader("Cache-Control","no-store") 禁用缓存 response.setHeader("refresh","time") 设置页面自动刷新 response.setDateHeader("refresh","5;URL=path") 定时跳转网页 response.setBufferSize(int Size) 设置缓冲区大小 response.reset() 清除缓冲区内容 response.isCommitted() 监测服务器是否把数据写入客户端 response.flushBuffer() 刷新,强制将数据写入客户端 response.getBufferSize() 获得缓冲区的实际大小,没有缓冲区则返
1,response响应生成非字符响应
对于需要生成非字符响应的情况,就应该使用response来响应客户端请求。response是HttpServletResponse接口的实例,该接口提供了一个getOutputStream()方法,该方法返回响应输出字节流。
<%@ page import="java.awt.image.BufferedImage" %> <%@ page import="java.awt.*" %> <%@ page import="javax.imageio.ImageIO" %> <%@ page contentType="image/png" language="java" %> <html> <head> <title>Title</title> </head> <body> <% BufferedImage image = new BufferedImage(340,160,BufferedImage.TYPE_INT_BGR);//创建BufferedImage对象 Graphics g = image.getGraphics(); g.fillRect(0,0,400,400); g.setColor(new Color(255,0,0)); g.fillArc(20,20,100,100,30,120); g.setColor(new Color(0,255,0)); g.fillArc(20,20,100,100,150,120); g.setColor(new Color(0,0,255)); g.fillArc(20,20,100,100,270,120); g.setColor(new Color(0,0,0)); g.setFont(new Font("Arial Black",Font.PLAIN,16)); g.drawString("Hello JSP",200,60); g.dispose(); ImageIO.write(image,"png",response.getOutputStream()); %> </body> </html>
先设置服务器响应数据是image/png,这表明服务器应 是一张PNG图片。接着创建一个BufferedImage对象(代表图像),并获取该BufferedImage的Graphics对象(代表画笔),然后通过Graphics向BufferedImage中绘制图像,最后一行代码直接将BufferedImage作为响应发送给客户端。
也可以直接在其他页面使用img标签代替这个图片
<img src="test.jsp"/>
这种临时生成图片的方式就可以非常容易地实现网页上的图形验证码功能。不仅如此,使用response生成非字符响应还可以直接生成PDF文件、Excel文件。这些文件可直接作为报表使用。
2,重定向
重定向是response的另外一个用户,与forward不同的是,重定向会丢失所有的请求参数和request范围的属性,因为重定向将生成第二次请求,与前一次请求不在同一个request范围内,所以发送一次请求的参数和request范围的属性全部丢失。
HttpServletResponse提供了一个sendRedirect(String path)方法,该方法用于重定向到path资源,即重新向path资源发送请求。
<% response.sendRedirect("index.jsp"); %>
注意地址栏的变化,执行重定向动作时,地址栏的URL会变成重定向的目标URL。
重定向会丢失所有的请求参数,使用重定向的效果,与在地址栏里重新输入新地址再按回车键的效果完全一样,即发送了第二次请求。
从表面上看,forward动作和redirect动作有些相似:它们都可将请求传递到另一个页面。但实际上forward和redirect之间存在较大的差异。
转发:forward 重定向:redirect 执行forward后依然是上一次请求 执行redirect后生成第二次请求 forward的目标页面可以访问原请求的请求参数,因为依然是同一次请求,所有元请求的请求参数、request范围的属性全部存在 redirect的目标页面不能访问原请求的请求参数,因为是第二次请求了,所有原请求的请求参数 地址栏里请求的URL不会变 地址栏改为重定向的目标URL。相当于在浏览器地址栏里输入新的URL,然后回车。
3,增加Cookie
Coolie通常用于网站记录客户的某些信息,比如客户的用户名及客户的喜好等。一旦用户下次登录,网站可以获取到客户的相关信息,根据这些客户信息,网站可以对客户提供更好的服务。Cookie与session的不同之处在于:session会随浏览器的关闭而失效,但Cookie会一直存放在客户端机器上,除非超出Cookie的生命期限。
由于安全性的原因,使用Cookie客户端浏览器必须支持Cookie才行。客户端浏览器完全可以设置禁用Cookie。
增加Cookie也是使用response内置对象完成的,response对象提供了如下方法:
- void addCookie(Cookie cookie):增加Cookie。
正如在上面的方法中见到的,在增加Cookie之前,必须先创建Cookie对象。然后按照下面步骤进行:
- 创建Cookie实例,Cookie的构造器Cookie(String name,String value)。
- 设置Cookie的生命周期,即该Cookie在多长时间内有效。
- 向客户端写Cookie。
使用Cookie对象必须设置其生存期限,否则Cookie将会随浏览器的关闭而自动结束。
<% String name = "燕双嘤"; Cookie cookie = new Cookie("name",name); cookie.setMaxAge(24*3600);//单位:秒 response.addCookie(cookie); %>
如果浏览器没有组织Cookie,执行上面程序后,网站就会向客户端写入一个名为name的Cookie,该Cookie将在客户端硬盘一直存在,直到超出该Cookie的生命期限。
<% Cookie[] cookies = request.getCookies();; for (Cookie c:cookies){ out.println(c.getName()+" "+c.getValue()); } %>
访问客户端的request对象,request提供了getCookie方法,该方法将返回客户端机器上所有Cookie组成的数组,遍历该数组的每个元素,找到需要的Cookie即可。
删除Cookie,只需要设置cookie的生命周期为0即可,不过为了更好的效果,我们按照如下设置:
<% Cookie killMyCookie = new Cookie("mycookie", null); //删除Cookie killMyCookie.setMaxAge(0); killMyCookie.setPath("/"); response.addCookie(killMyCookie); %>
cookie和session的区别:
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
所以个人建议:将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中。
解释session:当访问服务器否个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session
session原理:HTTP协议是非连接性的,取完当前浏览器的内容,然后关闭浏览器后,链接就断开了,而没有任何机制去记录取出后的信息。而当需要访问同一个网站的另外一个页面时(就好比如在第一个页面选择购买的商品后,跳转到第二个页面去进行付款)这个时候取出来的信息,就读不出来了。所以必须要有一种机制让页面知道原理页面的session内容。
问题:如何知道浏览器和这个服务器中的session是一一对应的呢?又如何保证不会去访问其它的session呢?
原理解答:就是当访问一个页面的时候给浏览器创建一个独一无二的号码,也给同时创建的session赋予同样的号码。这样就可以在打开同一个网站的第二个页面时获取到第一个页面中session保留下来的对应信息(理解:当访问第二个页面时将号码同时传递到第二个页面。找到对应的session。)。这个号码也叫sessionID,session的ID号码,session的独一无二号码。