1、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id
(搞错了,是sessionstorage不共享)
2、保存session id的几种方式
A.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
B.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。(我需要这个)
3、session什么时候被创建
一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
来源链接:https://www.jianshu.com/p/64241eebc60b
4、session存在的问题
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。
而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来说,Cookie或许是唯一的选择。
来源链接:https://juejin.im/entry/5766c29d6be3ff006a31b84e
5、cookie的局限性
Cookie功能需要浏览器的支持。
如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。
6、session机制
Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。(棒!)
7、session的创建
Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。
Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。
8、session的有效期以及修改方式
为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。
Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。
Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。
9、session对浏览器的要求
虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。
同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。
来源链接:https://www.cnblogs.com/zhouhbing/p/4204132.html
10、session是一个字典,它是如何保持登录状态的?它是怎样知道两次请求是同一个用户的?
只要 session 在每一个请求中是隔离的,那只需要在 session 中存储 login=True
的键值对,那么只要 session 中有这样的键值对,即可以表明发起该次请求的用户是登录的。每一次请求的 session 是隔离的,那么在 session 中存储 user_id=xxx
,如果某两次请求的 user_id
是相同的,那么这两次请求的用户即是相同的。
11、cookie的有效期
默认的 cookie 的有效期是当前会话,意思就是说,只要当前浏览器还没有关闭,就算当前页面关闭或者其他跳转到其他页面,再次回到该页面,cookie 还是保存着的
来源链接:https://windard.com/blog/2017/10/17/Flask-Session
12、在flask中使用session
在flask中使用session的前提是给app指定了一个 secret_key属性,可以通过配置文件来设置此属性。 flask中session是一个全局对象,就像request一样,每一个请求的上下文中都有一个 session 全局对象。
参考链接(链接里有个代码案例):http://litaotju.github.io/flask/2016/06/22/Learning-Flask-session/
13、一些flask session代码样例参考链接
https://www.letiantian.me/2014-06-28-flask-session/
https://www.jianshu.com/p/805f33f096d6
http://litaotju.github.io/flask/2016/06/22/Learning-Flask-session/
14、如果cookie被禁用,如何使用session(以后需要添加这个功能)
session的实现方式有两种
第一种:通过cookies实现。如果浏览器支持cookies,创建session的时候会把sessionID放在 cookies里面;
第二种:通过重写URL。如果浏览器不支持cookies,可以自己编程使用URL重写的方式实现session(访问页面的时候在地址栏里面,URL后会跟上sessionID,效果见展示图2)。
参考链接:https://www.zhihu.com/question/35307626
https://blog.csdn.net/u014225431/article/details/51644180
15、未来需要解决的任务——重复提交出现弹框问题(亲测确实会出现。。。)
之所以出现这种情况,是因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求。如果最后一个请求是POST,浏览器就会把上次输入的url再次post给服务端。。。
参考链接:https://www.jianshu.com/p/46fd7e66b7d5
16、表单提交时同时提交隐藏字段
https://blog.csdn.net/dengpeng0419/article/details/55045047
下面的两个链接留作参考(如果用的话,index.html还要改成bootstrap框架的,比较繁琐)
https://flask-bootstrap-zh.readthedocs.io/zh/latest/forms.html
https://zhuanlan.zhihu.com/p/23605789
隐藏字段可以用js的 math.random()函数随机生成
17、修改元素的value值(表单提交的隐藏字段就是提交value的值,这个值要用函数随机生成)
https://blog.csdn.net/a491857321/article/details/51780674
18、js随机生成一定位数的密码
https://blog.csdn.net/qq_30100043/article/details/78034852