cookie
cookie是一种浏览器提供的技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,例如常见的记住密码则是通过cookie来实现的。
cookie的格式:键值对用“=”链接,多个键值对间通过“;”隔开。
在响应头可以看见:Set-Cookie:key=value
cookie的创建和发送
通过new Cookie(“key”,“value”);来创建一个cookie对象,要想将Cookie随响应发送到客户端,需要先添加到response对象中,resp.addCookie(cookie);此时该cookie对象随着响应发送至了客户端。
cookie的获取
在服务器端提供了一个getCookies()的方法用来获取客户端回传的所有cookie组成的一个数组,如果获取单个cookie则需要通过遍历,getName()获取cookie的名称,getValue()获取Cookie的值。
cookie到期时间的设定
到期时间,是指该cookie何时失效。这个时间可以自己设定,通过setMaxAge(int time);方法设定cookie的最大有效时间,以秒为单位。
大于0的整数,表示存储的秒数:若为负数,则表示不存储该cookie;若为0,则删除该cookie。
负整数:cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。
正整数:表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也会存活相应的时间。
零:cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0)来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。
cookie的注意
1、在一般的站点中常常有记住用户名这样一个操作,该操作只是将信息保存在本机上,换电脑以后这些信息就无效了。而且cookie还不能跨浏览器。
2、Cookie 中不能出现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码。
3、cookie大小只能在4kb左右,每个浏览器在同一域名下存放cookie数量有限,每个浏览器大概是50个。
cookie的覆盖
如果服务端发送的cookie那么会覆盖原有的cookie;
cookie的路径
在Servlet中保存的Cookie如果没有设置path,那么它的path默认为当
前Servlet的所在路径;
当访问的路径包含了cookie的路径时,则该请求将带上该cookie;如果访
问路径不包含cookie路径,则该请求不会携带该cookie 。
Session
对于服务器而言,每一个连接到它的客户端都是一个 session,servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。
session 无论客户端还是服务器端都可以感知到,若重新打开一个新的浏览器,则无法取得之前设置的 session,因为每一个 session 只保存在当前的浏览器当中,并在相关的页面取得。
Session 的作用
- Session 的作用就是为了标识一次会话,或者说确认一个用户;
- 并且在一次会话(一个用户的多次请求)期间共享数据。
- 可以通过 req.getSession()方法,来获取当前会话的 session 对象。
JSESSIONID
- SessionId 是为了标识一次会话的唯一标志。
- 每当一次请求到达服务器,如果开启了会话(访问了 session),服务器第一步会查看是否从客户端回传一个名为 JSESSIONID 的 cookie;
- 如果JSESSIONID不存在,则服务器会新建session对象,并重新标识;
- 如果JSESSIONID存在,服务器会将客户端回传过来的ID去服务器中查找与之对应的session对象
- 如果没找到,则服务器会新建session对象,并重新标识;
- 如果找到,则获取 session对象,响应给客户端;
Session域对象
- 通过 setAttribute(name,value);方法向域对象中添加数据,
- 通过 getAttribute(name) 从域对象中获取数据,
- 通过 removeAttribute(name)从域对象中移除数据。
Session的失效
1、达到最大不活动时间
-
Tomcat中默认最大不活动时间为30分钟。
可以自行修改默认不活动时间,但不建议。在web.xml文件中
<session-config>
<session-timeout>30</session-timeout>
</session-config>
-
自己设定过期时间
通过 session.setMaxInactiveInterval(int);来设定 session 的最大不活动时间,单位为秒。
通过 getMaxInactiveInterval();方法来查看当前 Session 对象的最大不活动时间。
-
立即失效
手动销毁session对象 session.invalidate();
-
关闭浏览器
session的底层依赖于cookie,默认关闭浏览器失效。
-
关闭服务器
非正常关闭服务器时才会失效。
如果是正常关闭服务器,session会被钝化到本地磁盘,下次访问时会从本地磁盘中活化出来。
ServletContext对象
每个web应用(web项目)有且仅有一个ServletContext对象,又称为application对象。Web容器在启动时会为每个web应用创建一个ServletContext对象。
-
作用:
1、作为域对象,共享数据,在整个应用中都有效。
2、获取web应用相关信息
获取服务器版本 getServerInfo()
获取当前项目在服务器中真实路径 getRealPath()
-
获取ServletContext对象的方法
1、获取ServletContext对象
1> 通过request对象获取
request.getServletContext();
2> 通过session获取
request.getSession().getServletContext();
3> 通过getServletConfig()方法获取
getServletConfig().getServletContext();
4> 直接获取
getServletContext();
2、application域对象
通过 setAttribute(name,value);方法向域对象中添加数据,
通过 getAttribute(name) 从域对象中获取数据,
通过 removeAttribute(name)从域对象中移除数据。
3、常用方法
获取服务器版本 getServerInfo()
获取当前项目在服务器中真实路径 getRealPath()
文件上传
1、前台页面
表单实现文件上传
1、表单的提交类型为method=“POST”
2、表单类型设置为enctype=“multipart/form-data”
3、表单元素设置name属性值
2、后台代码
首先需要导入第三方 jar 包,http://commons.apache.org/
下 载commons-io 和 commons-fileupload 两个 jar 的资源。解压并导入到项目中。
commons-fileupload.jar 是文件上传的核心包
commons-io.jar 是 filefupload 的依赖包,同时又是一个工具包。
实现步骤:
DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个工具类
ServletFileUpload – 文件上传的核心类,此类接收 request,并解析ServletFileUpload.parseRequest(request); ----List 解析 request
1、 创建一个 DiskFileItemFactory 工厂类,并制定临时文件和大小
2、 创建 ServletFileUpload 核心类,接收临时文件,做请求的转换
3、 通过 ServletFileUpload 类转换原始请求,得到 FileItem 集合
4、 遍历集合中的各个元素并处理
5、 判断每个元素是否是普通表单项,如果是则按照普通表单项处理
6、 如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)
文件下载
-
Step1:需要通过 HttpServletResponse.setContentType 方法设置 Content-type 头字段的值,为浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型,
例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等
-
Step2:需要通过 HttpServletResponse.setHeader 方法设置Content-Disposition 头的值 为”attachment;filename=文件名”
-
Step3: 读取下载文件,调用 HttpServletResponse.getOutputStream 方法返回的 OutputStream 对象来向客户端写入附件内容。