- 客户端和服务端进行数据交互遵循的是HTTP协议,此协议是无状态协议(异常请求对应一次响应,响应完成之后断开连接)服务器是无法跟踪客户端的请求,通过Cookie技术可以给客户端添加一个标识,(此标识可以保存数据),客户端之后向此服务器法请求时会自动带上这个标识,这样服务器就可以识别此客户端了,但是由于Cookie的数据是保存在客户端中,存在被篡改的风险,Session可以避免出现这样的风险,因为Session数据是保存在服务器
- 通过会话管理Cookie和Session可以保存客户端的数据,数据库保存的是用户数据,
-
Cookie:数据保存在客户端(类似于打孔的会员卡,店里不保存信息,给你打个孔,或则盖个章,满几次送一杯奶茶,完全看你的卡,而店内(服务端)不会进行数据的保存),
1.数据默认保存在浏览器的内存中,当浏览器关闭时数据会清除,可以设置保存的时间(任意时间),设置之后数据就会保存在客户端的磁盘中,时间到了之后才会自动清除.
2,只能保存字符串类型数据
3.Cookie是存在客户端浏览器中每次请求会存放在请求头中,所有cookie只可以保存几k的数据
4,应用场景,记住用户名和密码 -
下面就是一个记住用户名和密码的典型案例:
- rem是我们前段页面传递过来的数据,是我们询问是否需要记住密码进行双向绑定的数据.
在我们的前段获取我们保存到cookie中的内容,然后通过created方法,已进入页面就请求到,然后在把它赋值给user对象,user对象和页面中的登录框数据进行双向绑定,我们就可以已进入页面就记住上次的密码显示到我们的输入框.
-
Session
-
Session:数据保存在服务器中(类似于银行卡,银行卡中是没有数据的,只是有一个我们的识别码,然后通过识别码去访问我们数据的数据)
1,数据保存在服务器的内存中,保存时间半个小时左右,
2,可以保存任意类型的数据
3,Session保存数据量没有大小限制,但是不建议保存大量数据
4,应用常见:记住登录状态(就是用些事情,只用登录了才能做.)
Session的存储形式
session类似于一个Map集合,里面可以存放多个键值对,是以key-value的形式存放的,
key必须是一个字符串,value是一个对象.
session底层实现机制
session是每一个浏览器(客户端)所唯一的,这个是怎么实现的呢?其实,在访问一个网站时,
在HTTP请求中往往会携带一个cookie,这个cookie的名字是JSESSIONID,这个JSESSIONID表
示的就是session的id,这个是由服务器创建的,并且是唯一的,服务器自使用session时,会根据
JSESSIONID来进行不同的操作.
如图:
- 下面是一个session的的常规应用.
1.把当前登录对象保存到session中
2,我们在我们的前端发请求获取当前的登录对象
3.获取登录对象以后我们就可以通过获取的登录对象对前端做一些事情,比如是否显示某些文本,向下面这个我们没有登录,所有这句就没有必要显示,那么我们就可以用我们的登录对象是否有值进行v-if绑定,确定是否显示
4.我们的退出登录,我们如果只是做退出登录,不做页面的判断,就是没有登录不能进行某些操作的等等需求,那么我们就可以不用在当前页面向后端controller发去请求,获取当前的登录对象,我们可以直接向后端发出退出等的请求.
然后再controller中删除我们的Session对象就可以了.
对于session
session就是一个存储在服务器的特殊对象,通过session可以实现数据的共享,session有一个JSESSIONID,这个session的唯一标识,使用它可以查找到session,session是会话级别的,对于每一个客户端来说是独享它所拥有的session.对于每一个客户端来说是独享它所拥有的session的,就像是我们每个都在同一台电脑上登录我们的账号,但是我们会进入别人的账号,因为我们此时传过去的用户名和密码保存都session中,session用的是key-value进行保存,没有个key都是唯一的,所以我们不会乱进入别人的登录页面,即使使用同一台电脑,我们用session进行页面页面跳转时,服务端可以利用session进行数据共享,session由服务器进行控制,session的创建和销毁都是服务器进行管理的,服务器会为每个客户端创建一个session.
问题:session只有半个小时的保存时间,就算使用setMaxInactiveInterval(int i):设置session最大的有效时间。
注意,这个有效时间是两次访问服务器所间隔的最大时间,如果超过最大的有效时间,那么这个session就失效了。(两次访问服务器是那两次,然后我们过了最大时间会怎么样,在自己没有主动的退出登录的情况下,会自动退出吗?我看到一个答案:客户端在半个小时内没有刷新session会自动失效,那么我们session在进行程序登录的时候我们是根据不同的程序,写了自动刷新这个功能吗?这是个问题,目前没有找到很好的答案,留在这里,等以后学得更多的时候,想起了,在来解决),对于这个session的有效期和过期的时间五花八门,但是我觉得有说你只要在这个程序中操作,那么就会刷新,这个应该是可以的,但是看到一个很不错的session和cookie的介绍,感觉比自己深入多了,把连接分享给你们:
http://t.csdn.cn/jKorp
上面的cookie和session我们可以进行权限的限制,但是我们如果每一个都这样一个一个的判断写代码就会很麻烦,所有我们可以用到过滤器,会让代码变得简单.
过滤器
作用:可以让客户群请求到服务器资源之前或之后经过过滤器
如何使用过滤器
- 创建Filter类文件
- 在WebFilter注解中配置处理请求的路径
- 在doFilter方法中处理请求,写上判断代码,条件满足执行chain.doFilter(request, response)
- 在xxxxApplication.java文件中添加@ServletComponentScan注解,进行过滤器扫描(不添加过滤器不生效)
Filter过滤器类创建方式
在WebFilter注解中配置处理请求的路径
在xxxxApplication.java文件中(启动类)添加@ServletComponentScan注解
过滤器urlParttens配置方式
- 精确匹配:/admin.html /insertProduct.html
- 后缀匹配:*.jpg *.html *.xxx
- 路径匹配: /product/* /user/*
- 全部匹配: /* (匹配网站中的所有资源)
有些网站做防盗图就是这样,只要你没有登录,那么你就无法在它的页面上上访问到图片,它的路径也是错误的.
比如我们上面的session与过滤器的结合使用.
从请求对象中获取Session,此时使我们客户端发过来的请求,然后把这个请求保存到Session中,然后我们再在这个session中获取我们的请求对象,因为我们在登录的时候,登录成功我们把登录的数据装入到了session中,并取名为”user”,此时我们在我们的过滤器取出这个叫”user”的session.通过我们的request请求到的数据,装入到我们这个叫”user”的session中,然后判断我们是否登录,然后决定是否放行.