用户状态数据的存储
cookie | session | |
---|---|---|
概念 | 服务器写到浏览器上的一小段String(不支持中文) 中文处理:java.net.URLEncoder.encode(str,编码) java.net.URLDecoder.decode(str,编码) | HttpSession是一个作用域,可以存放“命名属性” 会话:client与服务器端的一次完整的通信过程(涵盖多次请求) |
数据保存 | 在客户端浏览器中保存用户状态数据 | 在服务器端保存用户状态数据 |
数据量 | 文本格式存储在浏览器上,4kb | 不限量 |
创建对象/获取 | Cookie c = new Cookie( name , value ); | HttpSession session = request.getSession( boolean – true ); |
运行代码 | ①写cookie — response.addCookie©; ②读cookie — request.getCookies() --> Cookie[] 如果没有读到,返回值为null | ① 存数据 — session.setAttribute(“name”,value); ② 取数据 — Object value = session.getAttribute(“name”); ③ 移除数据 — session.removeAttribute(“name”); |
存活时间 | 设置存活时间 — cookie.setMaxAge( xxx ); ① 数字为正数: 表示存活多少秒 ② 数字为负数: 表示cookie会在浏览器关闭时被销毁 | 控制session的有效存活时间 ① 可以在tomcat的配置文件中修改tomcat产生的所有session的存活时间(统一修改) :tomcat — conf — web.xml (不建议) ② 可以针对某一个应用中使用的session进行修改 — 程序中通过函数调用修改:session.setMaxInactiveInterval( time ); time单位秒 ③ 主动销毁session对象 — 完成安全退出:session.invalidate(); (创建ExitAction) |
生命周期 | 生命周期较长 begin: 当client访问的程序里第一次出现request.getSession(true)代码时(懒汉式创建) end: timeout关闭session(服务器会为session设置一个有效存活时间 — 默认30分钟 ) | |
访问路径 | cookie.setPath("…"); 注:http协议规定,只有处于同一路径下的程序才能访问该路径下程序写过的cookie(默认不能跨应用) |
forward | redirect | |
---|---|---|
不同 | 一个请求,地址栏不变 | 两个请求,地址栏变化 |
使用选择 | 如果当前程序执行结束,功能没有彻底完成 or 有大量数据需要传递,则选择 forward 跳转 | 如果当前程序执行结束, 功能已经完成(下一个程序涉及其他功能),选择 redirect 跳转;无法确定,优选 redirect |
相同 | 代码运行后都可以使得程序的流程由AServlet跳转到Bservlet程序运行 |
session 的工作原理
session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。里面存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。可以从中取出对应的值。
[外链图片转存失败(img-72BQLeei-1562310646377)(C:\Users\AAA\AppData\Roaming\Typora\typora-user-images\1558444354850.png)]
与用户相关***(一个用户对应一个 session对象)*** — 浏览器软件(用户绑定)
① 问题: 在A程序里 sesssion.setAttribute(“name”,“hehe”); client1 访问了A程序
问:之后哪些程序可以通过session.getAttribute(“name”) 获取hehe数据
答:只要被client1请求的程序(不论功能),就可以得到hehe数据
② 原理:
当client向server申请session对象时,tomcat会首先读取浏览器上的cookie,查找JSESSIONID的cookie
—> 没找到: tomcat会为client创建新的session,同时将session的id以cookie的形式写入浏览器(cookie 浏览器关闭销毁)
—> 找到:获取cookie里的session id,在内存中查找对应的session对象,返回给client使用
③ 安全退出 和 关闭浏览器退出 的区别
安全退出 : 直接销毁client对应的session对象,并清除浏览器上的cookie
关闭浏览器退出: 存储了sessionid的cookie被销毁,再次访问时,无法提供之前session的id,tomcat为client创建了新的session(原有session仍然存活30分钟)
注意: 保存sessionid的cookie JSESSIONID – 32位16进制数
如果客户端禁止cookie,session 是否还能用
① 如果浏览器拒绝接收cookie,则程序无法完成功能(一般不要求程序做出处理)
② 如果使用response.encodeURL() 来处理跳转路径,则可以在浏览器不支持cookie的情况下,让前后两个 网页使用同一个session对象
方法功能: 检测浏览器是否支持cookie,支持(不做任何处理原样返回),不支持(将当前网页里的sessionid拼接到地址后面 url;jsessionid=xxxxxx )
jsp
jsp和servlet的区别
servlet | jsp | |
---|---|---|
标签与代码比重 | 在大量的java代码中嵌入少量的html标签,java代码的比重比较大 — XxxAction | 在大量的html标签中嵌入少量的java代码,html标签比重大 — XxxView |
运行原理 | 当client发出servlet请求后,tomcat会根据请求里的网名找到对应程序的对象,调用service方法运行,将程序的执行结果发还给client浏览器显示(client收到的执行结果)-------”Servlet技术是运行在server端的技术“ | 当client发出jsp请求后,tomcat会找到指定的jsp文件,将其翻译成java程序(servlet),然后按照servlet运行方式执行(client收到的执行结果)------”JSP技术是运行在server端的技术“ |
执行效率 | 较高 | 较低(由于需要tomcat进行编译解释,导致jsp网页第一次被访问时,网页回显速度慢,但文件改变后不需要重启服务器,不需要编写配置文件) |
session的创建方式 | HttpSession session = request.getSession( boolean – true ); | 不需要创建 |
HttpSession |
线程安全问题
servlet 程序 和 jsp 文件都只有一个对象产生:
servlet的线程安全保证:尽量不要定义实例变量
jsp文件的线程安全保证:尽量不要在声明脚本里定义变量
ervlet 程序 和 jsp 文件都只有一个对象产生:
servlet的线程安全保证:尽量不要定义实例变量
jsp文件的线程安全保证:尽量不要在声明脚本里定义变量