登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。
session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。
在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的。在传统的java web开发,我们通过实现 javax.servlet.Servlet 接口或继承 javax.servlet.http.HttpServlet 来实现客户端和服务端以Http协议交互。
2.1 操作Session的API对Session的操作如下:
@Override public 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的过期。
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对象获取所有cookie for (Cookie cookie : cookies) { String name = cookie.getName();//cookie name String value = 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("http://www.likecs.com/"); cookie.setMaxAge(60*30);//30分钟 response.addCookie(cookie);//回写给客户端浏览器 3.2 前端操作cookie