会话能够简单理解为:用户打开一个浏览器,点击多个超连接,访问服务器多个web资源,而后关闭浏览器,整个过程称之为一个会话。html
在java语言中,Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求,其中这个过程,保存会话中数据的两种重要技术:java
1.Cookie技术:web
Cookie是客户端技术,服务器把每一个用户的数据以cookie的形式写给用户各自的浏览器,并保存在客户端浏览器的缓存中。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。浏览器
2.Session技术:缓存
Session是服务器端技术,利用这个技术,服务器在运行时能够为每个用户的浏览器建立一个其独享的session对象,因为session为用户浏览器独享,因此用户在访问服务器的web资源时,能够把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。服务器
一.HttpSession原理cookie
Cookie和Session都能维护web客户端和web服务端的会话。session
1. 什么是HttpSessionapp
1) HttpSession属于服务端技术;编码
2) 在Servlet中,产生惟一的会话,必须经过request.getSession()才行,从新打开新的IE,会产生新的Session会话;
3) 在转发和重定向的状况下,多个Servlet中共享同一个HttpSession;
4) 同一个代码request.getSession(),但可能含义不一样,其一是表明建立新的会话,其二是取得原有的会话;
2. HttpSession原理
1) 会话底层是基于Cookie的;
2) 客户端发送请求头:Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E
3) 服务端发送响应头:Set-Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E; Path=/day08
所以,对于会话而言,经过JSESSIONID来维护客户端和服务端的状态;
4) 经过手工向客户端写入Cookie来达到多个浏览器共享会话的状况;
5) 确保浏览器能禁止Cookie成功,当Cookie被禁用,能够使用URL重写来维护客户端和服务端的状态;
6) 会话在服务端默认有效期为30分钟;
7) 若是有这样的错误:Session already invalidated:
则表示在无效的会话中取值,此时会话并无销毁,只是内容被清空而已;
8) 当浏览器阻止Cookie写入浏览器,能够使用URL重写;
二.HttpSession如何销毁
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <session-config> <session-timeout>1</session-timeout> </session-config> </web-app>
2. 经过HttpSession.invalidate()将当前会话设置为无效;
3. web服务器shutdown时,即销毁HttpSession;
4. 从新部署新的web应用。
注意:关闭浏览器,在默认状况下,会话不会销毁。
三.Cookie细节
注意:删除Cookie时,path必须一致,不然不会删除。
四.HttpSession细节
1.ssion对象被销毁以后,不能在会话中取其内容
代码:
session.invalidate();
//session.getAttribute("")此操做无效,不容许
五.乱码问题
ServletOutputStream以本地平台方法自动编码和解码,以解决中文输出问题,即用户不须要设置编码方法,ServletOutputStream已解决。
代码以下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream sout = response.getOutputStream(); sout.write("你好!".getBytes());
或者,用户能够自定义编码和解码方式,也能够解决中文输出问题。
代码以下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ServletOutputStream sout = response.getOutputStream(); sout.write("你们好!".getBytes("UTF-8")); }
2. 在Servlet中,以字符方式输出给浏览器时:须要在Servlet代码中设置服务端的编码方式和客户端的编码方式一致。
代码以下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //以字符方式输出中文 response.setContentType("text/html;charset=utf-8"); PrintWriter pw = response.getWriter(); pw.write("你好!你们好!"); }
六.什么样的场景下选用不一样的域对象
七.Get 和 Post 请求时的转发和重定向
1) 在doGet()方法下进行转发时,则转发到的页面代码是doGet()方法下执行的代码;
2) 在doPost()方法下进行转发时,则转发到的页面代码是doPost()方法下执行的代码;
2. 重定向问题:
1) 在doGet()方法下进行重定向时,则重定向到的页面代码是doGet()方法下执行的代码,由于重定向后是由客户端浏览器重新以request()的Get请求头方式请求;
八.会话对象经常使用的AIP
Cookie cookie = new Cookie("name","xiaoming"); System.out.println(cookie.getName());//输出name System.out.println(cookie.getValue());//输出name对应的值,即xiaoming cookie.setMaxAge(60);//设定这个cookie的最长存活时期,单位:秒 int time = cookie.getMaxAge();//返回这个cookie指定的最长存活时期
2. Session对象
//有两层含义,其一是建立新的session会话,其二是获得该web客户端对应的会话 HttpSession session = request.getSession(); session.getId()//获取session的ID session.isNew()//判断其是否新旧 session.setAttribute("name", "xiaoming");//绑定域中的信息 String name = (String)session.getAttribute("name");//获取域中指定绑定的信息 Long time = session.getLastAccessedTime();//获取会话最后的请求时间 session.invalidate()//终止这个session。全部绑定在这个session上的数据都会被清除。