一、HttpSession
1、HttpSession对象是由容器创建在,保留在服务器的内存中。
2、它也是一个域对象,提供了
Object getAttribute(String name)
void setAttribute(String name,Object obj)等方法。
3、一个浏览器独占一个HttpSession对象(默认情况下)
4、获取HttpSession对象:HttpServletRequest.getSession()
二、什么时候开启浏览器算是开始一次新会话?(同一个网站)
1、IE8(含)及以上,开启一个新的浏览器进程,与原来开启的进程共享同一次会话
若想不同进程或页面有各自的会话对象,“文件”\"新建会话"
2、IE7(含)及以下,开启一个新的浏览器进程,与原来开启的继承不共享同一次会话
3、一个新的Tab浏览器标签,与之前的页面属于同一次会话
4、通过超链接开启的新窗口也是属于同一次会话
三、HttpSession对象的获取都是通过request.getSession()方法得到。
每个HttpSession对象都有一个唯一的ID。(HttpSession.getId())
之所以不同客户端的数据正常显示,那是因为服务器向浏览器写了一个特殊的cookie,
该Cookie的名字为“JSESSIONID”,值为HttpSession对象的ID
三、HttpSession对象的获取细节
HttpServletRequest.getSession():
客户端第一次访问:创建HttpSession对象
如果服务器根据JSESSION的在内存中找到了对应的HttpSession对象:获取HttpSession对象。
HttpServletRequest.getSession(booleancreate):
如果为false:只是获取
如果为true:跟无参的方法功能一致。
服务器怎么分配session的id?服务器随机分配的一个唯一的ID
四、Base64编码规则
把原来的字节由3个字节转换成为4个字节
五、客户端禁用Cookie后,对于使用http://localhost来访问的,禁用无效。
客户端禁用Cookie后,需要对使用到的所有URL进行重写
url;JSESSIONID=234243
HttpServletResponse.encodeURL(String url):可以完成重写
智能方法:判断浏览器有没有禁用,禁用了重写URL,没禁用,不重写。
六、HttpSession对象的生命周期
1、浏览器关闭,会话结束,单服务器并不会立刻销毁对应的HttpSession对象。
2、HttpSession对象何时被销毁?
a、没有重写Cookie前提下:第二知识点
b、超时默认时间是30分钟。
可以修改web.xml,增加以下配置修改默认的超时时间
<session-config>
<session-timeout>1</session-timeout>
<!--单位是分钟-->
</session-config>
c、HttpSession.invalidate():立刻销毁session对象。
七、HttpSession对象的状态
八、JSP知识
1、原理:JSP就是Servlet。学习最好的办法是记住JSP生成的Servlet的模样
2、最佳实践:Servlet处理业务逻辑(控制器);JSP只负责显示
JSP最终用途:负责显示,且不能有一行Java脚本
3、修改MyEclipse生成的JSP模板
找到Servlet.java模板。JSP模板与他在一块。
template\jsp\Jsp.vtl JSPMetaTags.vtl
会话状态转换
新建一个Session---request.getSession()-->运行状态----request.invalidate()---->销毁
运行状态---搁置(1.内存中的Session太多,有的session长时间没有用,但并没有超时. 2.应用被重新加载,或容器启动了)/激活(用户开始使用了,应用启动了)--->持久化
JSP运行原理
第一次访问: IE----容器----JSP页面----jsp翻译成Servlet----编译成Class
容器----Class
表单重复提交问题:
登陆页面:Servlet来生成
1、产生输入表单
2、向session中放一个唯一的ID
令牌Token
3、使用一个hidden存放该ID
RegistServlet:
1、hidden:ID
2、Session:ID
比对:
1、相同:证明没有重复提交,做保存处理;从session中删除该ID
2、不相同:是重复提交
因篇幅问题不能全部显示,请点此查看更多更全内容