解决方案:web
1.在URL地址栏拼接参数,可是不安全(`www.xxx.do?userId=1`)
2.使用Cookie
3.使用Session
复制代码
Cookie是客户端技术,全部的浏览器都支持Cookie缓存,Cookie数据存放的位置位于客户端的内存中,也能够调整Cookie存放与磁盘中。跨域
步骤:浏览器
1.用户请求一个支持Cookie的后台服务器缓存
2.服务器作请求处理,返回相应信息,并设置Cookie缓存用户信息。在能够在开发者模式相应头中看到Set-Cookie
看到Cookie中的数据,在后续的请求都会自动发送Cookie到服务器,直到Cookie销毁或过时。tomcat
3.客户端再次请求,在请求头中携带Cookie。安全
4.服务器接收到请求数据,并解析Cookie内容,作出请求相应。服务器
Cookie分为会话Cookie和持久化Cookie。会话Cookie存放与客户端的内存中,浏览器关闭后Cookie自动销毁;持久化Cookie存放于磁盘中,浏览器关闭后不会销毁Cookie。能够经过cookie.setMaxAge(value);
来设置Cookie的存活时间。cookie.setMaxAge(0);
表示删除Cookie,cookie.setMaxAge(value<0);
表示会话Cookie;cookie.setMaxAge(value>0);
指定描述,能够用于设置持久化Cookie。cookie
设置Cookie的做用域session
Cookie中的字段中有两个能够设置Cookie的做用域。Path
设置Cookie的有效URL路径,Domain
指定Cookie的有效域。网站
cookie.setPath("/");
表示Cookie的做用域为整个应用,cookie.setPath("/**");
表示Cookie的做用域为**
的做用范围,路径为**
都能访问到Cookie,cookie.setPath("/view/a");
表示路径为view/a
的路径下都能访问Cookie,而view/b
不能访问到Cookie。
cookie.setDomain("value");
默认为web应用域名或者Ip地址。若是须要设置跨域访问:photo.google.com
和mail.google.com
实现cookie共享须要设置cookie.setDomain(".google.com");
Cookie的缺陷:
1.Cookie数据保留在请求头中,不安全。
2.Cookie数据存储中文须要转码,浏览器默认iso8859。
3.Cookie存放的数据为String类型
4.Cookie数据容量限制为4KB之内,一台服务器最多保留20个Cookie,一个客户端浏览器最多保存300个Cookie。
5.共享数据本应该放在服务器上。
Session是服务端技术,利用这个技术,服务器在运行时能够为每个用户的浏览器建立一个独享的Session对象,用于Session为用户浏览器独享,因此用户在访问服务器时,能够把各自的数据放在各自的Session中,当用户再去访问服务器其余web资源时,其余web资源再从服务端的Session中获取数据。
步骤:
1.用户请求一个支持Cookie的后台服务器
2.服务器作出请求处理,建立Session对象,保存用户的相关信息,并建立Cookie对象,Cookie对象的jsessionid
指向Session存放在服务器的内存地址。服务器经过相应头Set-Cookie
返回给浏览器Cookie的信息(Cookie中包含Session的内存地址,Session会消耗服务器的资源),在后续的请求都会自动发送Cookie到服务器,服务器经过解析Cookie中的jsessionid
来获取Session中的数据。
3.客户端再次请求,在请求头中携带Cookie。
4.服务器接收到请求数据,服务器经过解析Cookie中的jsessionid
在内存中来获取Session中的数据,作出请求相应。
Session超时管理
在浏览器与服务器的会话中,若是浏览器长时间没有与服务器进行交互,服务器的Session会自动销毁(网站登入后长时间没有交互后须要再次登入),浏览器与服务器以前的交互的Session就不存在了,若是须要再次用户Session的缓存,须要再次请求服务器从新建立新的Session。若是直接关闭浏览器,Session也会自动销毁,由于Session的应用地址时保存在Cookie中的,Cookie中数据是保存在浏览器的内存中的,浏览器关闭后Cookie销毁,没法识别Session的内存地址,超时后Session会自动销毁。
设置Session失效时间的三种方式:
1.在项目中的web.xml中设置,时间表示分钟
<session-config>
<session-timeout>2</session-timeout>
</session-config>
2.在tomcat的web.xml中设置,默认时30分钟
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3.在Servlet中设置
HttpSession session = request.getSession();
session.setMaxInactiveInterval(60);//单位为秒
-----------------
优先级是就近原则:Servlet>项目中的web.xml>Tomcat中的web.xml
复制代码
URL重写
Session依托Cookie来记录Session在服务器的内存地址,可是浏览器能够设置禁用Cookie,这样浏览器请求数据的时候没法携带jsessionid
致使Session在服务器中失效。可是咱们能够在地址栏手动拼接jsessionid
,如localhost:8080/demo;jessionid=***
,这样作很麻烦,Sun公司提供了两个方法用于在浏览器地址栏拼接jessionid
。
response.encodeUrl(url);
和response.encodeRedirectUrl(ulr);
。方法会先判断浏览器是否禁用了cookie,若是禁用了cookie会在url后拼接上jessionid
,若是浏览器没有禁用cookie,Session会经过请求头Cookie的jessionid
来传递。