博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Session和Cookie
阅读量:4046 次
发布时间:2019-05-24

本文共 5825 字,大约阅读时间需要 19 分钟。

Session和Cookie

文章目录

会话跟踪技术

会话跟踪技术是用来跟踪用户的会话,并且保持对用户会话之间的数据管理。

其中常用的会话跟踪技术是CookieSession

1. Cookie

Cookie是客户顿请求服务器端后,服务器给客户端的一个标识,并保存在客户端中

当客户端再次向服务器端发送请求时,会携带该标识,服务器就可以根据标识来识别客户端的身份或者状态。

1.1Cookie的应用

1.保持用户登录状态

将用户信息保存到Cookie中,并发送到浏览器中。将有效时间设置为一个较长的时间,这样子下次浏览器在进行访问一个网站时,服务器还能根据标识来识别用户。根据识别用户,用户就不需要输入用户名和密码等信息。

2.记录用户名

⼀旦⽤户登录成功以后,下次再登录时,直接将Cookie中的⽤户名读取并显示出来,这样⽤户就不需要再次输⼊⽤户名,只输⼊密码即可。

【举例1】.Cookie保持登录信息状态&删除Cookie

1.首先在重写的post方法中创建Cookie对象。根据对象与信息的匹配处理,返回到JSP页面进行响应。

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、输出信息。 req.setCharacterEncoding("utf-8"); String uname=req.getParameter("username"); String upass=req.getParameter("password"); System.out.println(uname+": "+upass); if ("小艾扶".equals(uname)&&"123".equals(upass)){
//登陆成功 System.out.println(uname+": "+upass); resp.sendRedirect("success.jsp"); } else{
//1.创建cookie对象 Cookie cookie = new Cookie("un",uname); //2.设置Cookie的有效时间。当前时间为0.进行如上举例时要切记删掉。 cookie.setMaxAge(0); //3.返回给前端 resp.addCookie(cookie); resp.sendRedirect("index.jsp"); } }
  • 上面重写的是doPost方法,因为在进行登录注册时候,对信息是较为保密的状态。进行post对安全性更加严谨。doGet方法可以仍意补充。
  • 后续在创建cookie对象时,需要声明好进行标识的地方(例如我上面只标识了账号名)。声明之后进行返回给前端进行响应。
  • 如果需要进行删除Cookie时,将第16行代码加上~。

2.其次在项目中的index.jsp中将响应回来的cookie对象进行处理,并显示于前端的界面中。

  <%    Cookie[] cookies = request.getCookies();    String value="";    if(cookies.length>0){      //先判断里面是否有内容      for (Cookie cookie:cookies){        if (cookie.getName().equals("un")){          value=cookie.getValue();          break;        }      }      pageContext.setAttribute("unamecookie",value);    }  %>  
登录:
密码:
  • 首先写入一个<form>表单,它将模拟一个登录的简单功能。
  • <%%>中填下如上代码。首先是获取java文件中获取cookie信息,对长度进行判断(如果为空的时候,直接进入for循环会有报错的现象呢!)。
  • 可以进行存值操作,也可以设置一个全局变量直接进行传参并在登录的<input>中添加value值。

最后会发现登陆之后返回,账号名会自动出现在上面哟~

1.2 Cookie的有效时间

  • Cookie发送给浏览器以后,浏览器并不会永久保存,也就是到了⼀定的时间以后浏览器会⾃动销毁 Cookie。Cookie的默认有效时间为⼀次会话(⼀次打开关闭浏览器的过程)
  • 同样的如上例子一样,我们可以⼿动指定Cookie的有效时间
//setMaxAge⽤来设置Cookie的最⼤有效时间,需要int型的参数,代表有效的秒数 cookie.setMaxAge(秒数); //当参数⼤于0时,会设置为指定的秒数 cookie.setMaxAge(30); //当参数等于0时,浏览器不会保存Cookie,Cookie⽴即失效 cookie.setMaxAge(0); //当参数⼩于0时,和不设置是⼀样,当前会话有效 cookie.setMaxAge(-100); //设置⼀个永久有效的Cookie,并⾮永久,只是使Cookie的⽣命很⻓⽽已 cookie.setMaxAge(60*60*24*365*10);

2. Session

在前面的学习中知道,Session主要进行的是会话的机制。但与此同时,Session是另一种记录客户状态的机制。

  • Session主要保存在服务器中而非像Cookie存放在客户端浏览器中。
  • 客户端浏览器访问服务器的时候,服务器将客户端信息以某种形式记录在服务器上,这就是Session。

如果说Cookie机制是通过检查客户身上的“通⾏证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”确认客户身份。Session相当于程序在服务器上建⽴的⼀份客户档案,客户来 访的时候只需要查询客户档案表就可以了。

2.1 创建Session的格式

对于Session而言,它对应的类是为javax.servlet.http.HttpSession类。每个来访者对应⼀个Session对象,所有该客户的状态信息都保存在这个Session对象⾥。Session对象是在客户端第⼀次请求服务器的时候创建的。

Session也是⼀种**key-value的属性对**,通过getAttribute(Stringkey)setAttribute(String key, Objectvalue)⽅法读写客户状态信息。Servlet⾥通过request.getSession()⽅法获取该客户的Session

HttpSession session = request.getSession(); // 获取Session对象session.setAttribute("loginTime", new Date()); // 设置Session中的属性out.println("登录时间为:" +(Date)session.getAttribute("loginTime")); // 获取(将其转换为Data对象进行获取时间)//Session属性

2.2 Session的生命周期

  • 前面介绍到,Session保存在服务器端。但是为了获得更高的存取速率,服务器一般将Session放在内存中。每一个用户都有一个独立的Session
  • 如果Session内容过于繁多,则容易造成内存溢出。
  • 因此在进行Session应用是时更多将其信息言简意赅

生命周期步骤如下:

  1. 首先在进行第一次访问时,服务器会自动创建Session。(只有访问JSP、Servlet等程序时才会创建 Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未⽣成Session,也可以使 request.getSession(true)强制⽣成Session。)
  2. 由于越来越多的用户进行访问,Session会越来越多。
  3. 为了防止内存溢出,服务器会将长时间没有活跃的session将内存中删除。这就是session的超时时间。如果超过该超时时间没有访问服务器,那么Session就会自动失效。

2.3 Session的常用方法

如上所示,这些都是Session的常用方法。

3.Cookie和Session的区别

  1. Cookie数据保存在客户端,Session数据保存在服务器端
  2. Session是由应⽤服务器维持的⼀个服务器端的存储空间,⽤户在连接服务器时,会由服务器⽣成⼀个唯⼀的SessionID,⽤该SessionID 为标识符来存取服务器端的Session存储空间。⽽SessionID这⼀数据则是保存到客户端,⽤Cookie保存的,⽤户提交⻚⾯时,会将这⼀SessionID提交到服务器端,来存取 Session数据。这⼀过程,是不⽤开发⼈员⼲预的。所以⼀旦客户端禁⽤Cookie,那么Session也会失效
  3. Cookies是属于Session对象的⼀种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者⼀个Cookie的⽂本⽂件中;⽽Session则会占⽤服务器资源。所以,尽量不要使⽤Session,⽽使⽤ Cookies。但是我们⼀般认为Cookie是不可靠的,Cookies是保存在本机上的,但是其信息的完全可⻅性且易于本地编辑性,往往可以引起很多的安全问题Session是可靠地。但是⽬前很多著名的站点也都⽤Cookie。

4.过滤器

4.1 过滤器的基本概念

过滤器就是对web资源进⾏拦截,通过做⼀些处理后再交给下⼀个过滤器servlet处理,通常都是⽤来拦截request进⾏处理的,也可以对返回的response进⾏拦截处理

4.2 过滤器的语法格式

1.创建一个类,实现Filter接口。

public class CharSetFilter implements Filter{
}

2.重写接口中的方法

public void destroy() {
//销毁的⽅法}public void doFilter(ServletRequest req, ServletResponse resp, FilterChainchain) throws ServletException, IOException {
//过滤⽅法 主要是对request和response进⾏⼀些处理,然后交给下⼀个过滤器或Servlet处理 chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException {
/*初始化⽅法 接收⼀个FilterConfig类型的参数 该参数是对Filter的⼀些配置*/ }

3.在web.xml中进行设置

过滤器名称
过滤器所在的路径
过滤器名称
需要过滤的资源

4.3 使用场景

1.如何防⽌⽤户未登录就执⾏后续操作

String name=(String)session.getAttribute("key"); if(name==null){
//跳转到登录⻚⾯ }

2.设置编码⽅式–统⼀设置编码

3.加密解密(密码的加密和解密)

4.⾮法⽂字筛选

**5.下载资源的限制 **

过滤器的特点:在servlet之前和之后都会被执⾏

5. 监听器

监听就是在监听某个域对象的状态变化的一个组件。

5.1 监听器的相关概念:

  • 事件源:被监听的对象(三个域对象 request、session、servletContext)
  • 监听器:监听事件源对象事件源对象的状态的变化都会触发监听器
  • 注册监听器:将监听器与事件源进⾏绑定
  • 响应⾏为:监听器监听到事件源的状态变化时所涉及的功能代码(程序员编写代码)

5.2 监听器分类

  • 横轴按照被监听的对象划分:ServletRequest域、HttpSession域、ServletContext域
  • 纵轴按照监听的内容分:监听域对象的创建与销毁监听域对象的属性变化

5.3 监听三大域对象的创建与销毁

监听器的编写步骤(重点)

  • 编写⼀个监听器类去实现监听器接⼝
  • 覆盖监听器的⽅法
  • 需要在web.xml中进⾏配置—注册
对象 作用 生命周期
ServletContextListener 监听ServletContext域的创建与销毁的监听器 创建:服务器启动创建
删除:服务器关闭
HttpServletListener 监听HttpServietListener域的创建和销毁的监听器 创建:第一次调用request.gerSession方法时创建
销毁:服务器关闭销毁,Session过期
ServletRequestListener 监听ServletRequest域的创建与销毁的监听器 创建:每一次创建时会调用一次request
销毁:请求关闭

ServletContextListener的作用:

  • 初始化工作:初始化对象、数据
  • 加载初始化的一些配置文件(spring配置文件)
  • 任务调度(定时器—Timer/TimerTask)

HttpServletListener的作用:

默认创建Session下,可以统计网站访问的用户

转载地址:http://oegdi.baihongyu.com/

你可能感兴趣的文章
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
一文看清HBase的使用场景
查看>>
解析zookeeper的工作流程
查看>>
搞定Java面试中的数据结构问题
查看>>
慢慢欣赏linux make uImage流程
查看>>
linux内核学习(7)脱胎换骨解压缩的内核
查看>>
以太网基础知识
查看>>
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>