Web项目中,Session存放用户信息比Cookie更安全

文章目录

      • 一、会话技术
        • 1.1 Cookie
            • 快速入门
            • 细节使用
            • Cookie的特点
            • Cookie的作用
        • 1.2 Session
            • 快速入门
            • 细节使用
            • Session特点
        • 1.3 Cookie和Session的区别
      • 二、JSP
            • JSP的脚本(JSP定义Java代码的方式)
            • JSP隐含对象
            • JSP指令
            • JSP注释
            • JSP EL
            • JSP 标准标签库(JSTL)

一、会话技术

会话:指一次会话中包含多次请求和响应。

一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止(这个断开指浏览器关闭了、或者服务器关闭了)。

会话功能:在一次会话的范围内的多次请求间共享数据。

会话的两种方式:客户端会话技术Cookie 、服务器端会话技术Session。

1.1 Cookie

Cookie 是客户端会话技术,它将数据保存在客户端(如浏览器)。Cookie会话技术基于响应头 set-cookie 和请求头 cookie 实现。

快速入门
  1. 创建Cookie对象,绑定数据: new Cookie(String name, String value)
  2. 发送Cookie对象: response.addCookie(Cookie cookie)
  3. 获取Cookie,拿到数据: Cookie[] request.getCookies()
细节使用
问题 解决
可以一次发送多个cookie吗? 可以。
可以通过创建多个Cookie对象,使用response调用多次addCookie()方法发送cookie。
cookie能浏览器中保存多长时间? 默认情况下,当浏览器关闭后,cookie数据被销毁。
也可持久化存储,通过 setMaxAge(int expiry) 实现。
1. expiry为正数:将cookie数据写到硬盘的文件中,持久化存储,并指定cookie存活时间,时间到后,cookie文件自动失效;
2. expiry为负数:默认值;
3. expiry等于零:意味着删除该cookie键。
cookie能不能存放中文? 在Tomcat 8 之前(Tomcat 7 及以下版本)不能直接存储中文,需要将中文转码(URL编码存储,URL解码解析)。
Tomcat 8 之后,cookie支持中文数据,但不包括特殊字符。
cookie获取范围多大?
1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
2. 不同的tomcat服务器间能实现cookie共享吗?
1. 默认情况下cookie不能共享。但也可以手动设置 setPath("/")
2. 如果设置一级域名相同,那么多个服务器之间cookie可以共享 setDomain(String path)
Cookie的特点
  1. Cookie数据存储在客户端浏览器;
  2. 浏览器对于单个Cookie的大小有限制(4kb),且对同一个域名下的总Cookie数量也有限制(20个)。
Cookie的作用
  1. Cookie一般用于存储少量的不太敏感的数据;
  2. 在不登录的情况下,完成服务器对客户端的身份识别。

1.2 Session

服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的 HttpSession 对象中。Session的实现是依赖于Cookie的。

快速入门
  1. 获取HttpSession对象: HttpSession session = request.getSession()
  2. 使用HttpSession对象: Object getAttribute(String name)void setAttribute(String name, Object value)void removeAttribute(String name)
细节使用
问题 解决
当客户端关闭后,服务器不关闭,两次获取session是否为同一个? 默认情况下,不是。
如果需要相同的,则可以创建Cookie对象,通过设置Cookie键JSESSIONID的最大存活时间,让Cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
客户端不关闭,服务器关闭后,两次获取的session是否为同一个? 不是同一个。
那么如何才能确保数据不丢失?通过session的钝化/活化实现。
session什么时候被销毁? 1. 服务器关闭的时候;
2. 调用session对象invalidate()方法;
3. session默认失效时间 30分钟。该默认时间可以修改,在Tomcat的conf目录下的web.xml文件中,找到并修改以下信息:

30
Session特点
  1. session用于存储一次会话的多次请求的数据,存在服务器端。
  2. session可以存储任意类型、任意大小的数据。

1.3 Cookie和Session的区别

  • Session存储数据在服务器端,Cookie在客户端。
  • Session没有数据大小限制,Cookie有。
  • Session数据安全,Cookie相对于不安全。

二、JSP

Java Server Pages (Java 服务器端页面)。本质上仍是一个Servlet。

JSP的脚本(JSP定义Java代码的方式)
  • <% 代码 %> :定义的Java代码,在service()方法中。service()方法中可以定义什么,该脚本中就可以定义什么。
  • <%! 代码 %> :定义的Java代码,在jsp转换后的Java类的成员位置。
  • <%= 代码 %> :定义的Java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
JSP隐含对象

JSP支持九个自动定义的变量,称为隐含对象,也叫内置对象。

对象 描述
request HttpServletRequest类的实例
response HttpServletResponse类的实例
out PrintWriter类的实例,用于把结果输出至网页上
session HttpSession类的实例
application ServletContext类的实例,与应用上下文有关
config ServletConfig类的实例
pageContext PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page 类似于Java类中的this关键字
Exception Exception类的对象,代表发生错误的JSP页面中对应的异常对象
JSP指令

JSP指令用于配置JSP页面,导入资源文件。语法格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>

这里有三种指令标签:

指令 描述
<%@ page … %> 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等。
可以使用的属性有:
import导包;
errorPage当前页面发生异常后,会自动跳转到指定的错误页面;
isErrorPage标识当前也是是否是错误页面(true可以使用内置对象exception,默认值false不可以使用内置对象exception)
<%@ include … %> 包含其他文件。如:
<%@include file="top.jsp"%>
<%@ taglib … %> 引入标签库的定义,可以是自定义标签。如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSP注释
  • 只能注释 html 代码片段,注释内容仍会发送到 respond 里面,只是浏览器不会实现其中代码。
  • <%-- 注释内容 --%> 可以注释所有,且浏览器不会接收到注释内容。
JSP EL

JSP 表达式语言(EL 表达式) 使访问存储在 JavaBean 内中的数据变得非常简单。语法格式:${表达式}

如何使用它?

  1. 算术和逻辑操作符

    操作符
    算数运算符 +、—、*、/(div)、%(mod)
    比较运算符 >、<、>=、<=、==、!=
    逻辑运算符 && 、|| 、!
    空运算符 empty用于判断字符串、集合、数组对象是否为null或者长度是否为0。
    ${empty list} 判断字符串、集合、数组对象是否为null或者长度为0。
    ${not empty str} 表示判断字符串、集合、数组对象是否不为null并且长度>0。
  2. 获取值

    要求 实现
    从指定域中获取指定键的值 ${域名称.键名} ,如 ${requestScope.name}
    从最小的域中查找是否有该键对应的值,直到找到为止。 ${键名}
    获取对象、List集合、Map集合的值 1. 获取对象 ${域名称.键名.属性名}
    2. 获取List集合 ${域名称.键名[索引]}
    3. 获取Map集合 ${域名称.键名.key名称}${域名称.键名["key名称"]}

    EL 表达式只能从域对象中获取值,域对象有(作用范围从小到大):pageScope(将从pageContext对象中获取值)、requestScope(将从request对象中获取值)、sessionScope(将从session对象中获取值)、applicationScope(将从application对象即ServletContext中获取值)

JSP 默认支持EL表达式。那么如何禁用EL表达式原文本展示呢?1. 给jsp的page指令中设置 isELIgnored="true" ,表示忽略当前jsp页面中所有的EL表达式;2. \${表达式} ,忽略当前这个EL表达式。

JSP 标准标签库(JSTL)

JavaServer Pages Tag Library。是由Apache组织提供的开源的免费的jsp标签。用于简化和替换jsp页面上的java代码。

使用步骤:

  1. 导入jstl相关jar包:javax.servlet.jsp.jstl.jar 、jstl-impl.jar,下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
  2. 引入标签库,taglib指令:<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. 使用标签

常用的JSTL标签 :

你可能感兴趣的:(JavaWeb,后端,Web,Session)