复制代码4、Session共享 对于多网站(同一父域不同子域)单服务器,我们需要解决的就是来自不同网站之间SessionId的共享 。由于域名不同(aaa.walking.com 和 bbb.walking.com),而SessionId又分别储存在各自的cookie中,因此服务器会认为对于两个子站的访问,是来自不同的会话 。解决的方法是通过修改cookies的域名为父域名达到cookie共享的目的,从而实现SessionId的共享(非服务器集群session共享) 。带来的弊端就是,子站间的cookie信息也同时被共享了 。
1.4 应用场景
登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了 。这个时候用到的一个机制就是cookie 。session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session 。
2. 怎么操作Session
在JAVA Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的 。在传统的java web开发,我们通过实现 javax.servlet.Servlet 接口或继承 javax.servlet.http.HttpServlet 来实现客户端和服务端以Http协议交互 。
2.1 操作Session的API
对Session的操作如下:
@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpSession session = request.getSession();session.setAttribute("userName","walking");//设置属性 session.setMaxInactiveInterval(30*60);//过期时间 单位秒 session.getCreationTime();//获取session的创建时间 session.getLastAccessedTime();//获取上次与服务器交互时间 String id = session.getId();//获取sessionId int timeout = session.getMaxInactiveInterval();//获取session过期时间 session.invalidate();//销毁session}复制代码客户端与服务端对用户信息的维持有一个时间限制,由于客户端长时间(休眠时间)没有与服务器交互,该session被认为已过期,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了 。这就是session的过期 。
【Java基础一文搞懂Session和Cookie的用法及区别】2.2 设置Session过期时间
2.2.1 传统web项目中设置Session过期时间
1、在web.xml中设置session-config
如下:
<session-config> <session-timeout>2</session-timeout></session-config>复制代码即,客户端连续两次与服务器交互间隔时间最长为2分钟,2分钟后session.getAttribute()获取的值为空 。原来的session已被销毁,从新的session里获取之前设置的属性值自然就为空了 。
2、在Tomcat的/conf/web.xml中
session-config,默认值为:30分钟
<session-config> <session-timeout>30</session-timeout></session-config>复制代码3、在Servlet中设置
HttpSession session = request.getSession();session.setMaxInactiveInterval(60);//单位为秒复制代码2.2.2 SpringBoot项目中设置Session过期时间
2.3 说明
1.优先级:Servlet中API设置 > 程序/web.xml设置 > Tomcat/conf/web.xml设置
2.若访问服务器session超时(本次访问与上次访问时间间隔大于session最大的不活动的间隔时间)了,即上次会话结束,但服务器与客户端会产生一个新的会话,之前的session里的属性值全部丢失,产生新的sesssionId
3.客户端与服务器一次有效会话(session没有超时),每次访问sessionId相同,若代码中设置了session.setMaxInactiveInterval()值,那么这个session的最大不活动间隔时间将被修改,并被应用为新值 。
4.Session的销毁(代表会话周期的结束):在某个请求周期内调用了Session.invalidate()方法,此请求周期结束后,session被销毁;或者是session超时后自动销毁;或者客户端关掉浏览器
5.对于JSP,如果指定了<%@ page session="false"%>,则在JSP中无法直接访问内置的session变量,同时也不会主动创建session,因为此时JSP未自动执行request.getSession()操作获取session 。
3. 操作Cookie
3.1 服务端操作Cookie
前面说过,客户端每次请求服务器会把cookie信息放到header头信息中,我们可以通过 HttpServletRequest.getCookies()方法获取所有cookie对象,通过 HttpServletResponse 对象的addCookie方法向客户端返回cookie 。
具体操作API如下:
Cookie[] cookies = request.getCookies();//request对象获取所有cookiefor (Cookie cookie : cookies) { String name = cookie.getName();//cookie name String value = https://www.isolves.com/it/cxkf/yy/JAVA/2019-09-26/cookie.getValue();//cookie value String domain = cookie.getDomain();//域名 int maxAge = cookie.getMaxAge();//过期时间 boolean secure = cookie.getSecure();//浏览器通过安全协议发送cookies 返回true String comment = cookie.getComment();//描述 int version = cookie.getVersion();//版本 //以上除name属性都有对应set方法 boolean httpOnly = cookie.isHttpOnly();//是否Httponly cookie.setHttpOnly(true);//设置Httponly值}//new cookie对象Cookie cookie = new Cookie("userName","walking");cookie.setPath("/");cookie.setMaxAge(60*30);//30分钟response.addCookie(cookie);//回写给客户端浏览器复制代码
推荐阅读
- Python完整代码带你一文看懂抽样
- 提升Java开发效率必看!教你如何在MyEclipse中使用内联搜索
- Web前端和Java开发哪个薪资更高,发展前景更好?
- 夏天,以“热”逼寒毒,不贪二凉,坚持三勤,给秋冬健康打下基础
- 乌龙茶分类大全乌龙的必备基础知识
- 一文看懂Oracle 数据库物化视图和物化视图日志
- 如何用JavaScript创建弹出窗口
- 帮你理清楚Java反射应该如何写
- Java性能之优化RPC网络通信
- Java 程序员需要用到 10 个测试框架和库
