1、Session的获取
(1)无参的方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(); System.out.println(httpSession.getId()); }
请求中无Cookie,但是响应中存在Cookie:
当再次访问该Servlet的时候,请求中存在Cookie,响应中的Cookie已经没有了:
以上为无参的方法获取Session,如果没有Session则创建一个,如果有则直接返回。
(2)有参的方法:
参数为false:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(false); System.out.println(httpSession.getId()); }
如果有Session则直接返回。
没有的话返回500错误:
参数为true:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(true); System.out.println(httpSession.getId()); }
此方法与不加参数等效。
2、Session的有效期限:
前三次访问是连续访问三次CookieServlet,可以看出,SESSIONID的值是不会发生变化的,但是当关闭了浏览器,第四次访问CookieServlet时,SESSIONID发生了变化;第五次为更换了浏览器之后的结果,SESSIOID依旧会发生变化。
以下情况下Session需要重新建立:
(1)用户关闭了浏览器。但是关闭了浏览器并不代表Seesion已经被销毁了,因为Session保存在服务器内部。
(2)关闭了服务器。
(3)用户没有向服务器提出请求(超过30分钟),过期后服务器自动删除,从不操作服务端资源开始计时。
可以修改(直接修改或在自己的web.xml中配置,将默认的时间覆盖掉)。
3、Session的设置:
(1)时间:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(true); httpSession.setMaxInactiveInterval(10);//十秒后失效 System.out.println(httpSession.getId()); }
第一次访问,成功返回SESSIONID。
过十几秒钟后重新访问发现SESSIONID的值已经改变了:
这是因为第一个SESSIOID已经过期了,需要创建第二个。
(2)强制失效(手动销毁):
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); HttpSession httpSession=request.getSession(true); httpSession.invalidate(); System.out.println(httpSession.getId()); }
即执行invalidate()后可以将创建的SESSION立即结束。
4、session的特点:
(1)存储在服务器端。
(2)依赖于Cookie,借助Cookie存储JSESSIONID。
(3)存在有效期限。
5、session的数据共享
要体现出Session的数据共享,需要建立两个Servlet:
第一个:建立Session,将值设置为Tom。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String name="Tom";
HttpSession httpSession=request.getSession(true);
httpSession.setAttribute("name",name);
System.out.println(httpSession.getId());
}
第二个获取Session:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession httpSession=request.getSession();
System.out.println(httpSession.getAttribute("name"));
}
也就是说对于不同的请求,都可以共享Session中的数据,他们的请求针对的是同一个Session,但是要保证Session没有失效。即没有关闭浏览器,没有过期,Session中的数据存储在服务器。
6、session的应用
(1)使用Cookie实现的登录的不足:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式 Cookie[] cookies=request.getCookies(); Connection con=null; login log= null; int successNum=0; try { con= C3p0Utils.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "Select * from login"; List<login> list = qr.query(con, sql, new BeanListHandler<login>((login.class))); if(cookies!=null) {//验证数据库中是否有与Cookie对应的用户 for (int i = 0; i < list.size(); i++) { log= list.get(i); for (Cookie cookie : cookies) { if((log.getAccount().equals(cookie.getName()))&&(log.getPassword().equals(cookie.getValue()))){ successNum++; } } } if(successNum>=1){ response.getWriter().write("Successful login with Cookie!"); } else{ request.getRequestDispatcher("page").forward(request,response); } } else{ request.getRequestDispatcher("page").forward(request,response);//请求转发 } } catch (SQLException e) { throw new RuntimeException(e); } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
response.getWriter().write("<html>");
response.getWriter().write("<head>");
response.getWriter().write("<title>");
response.getWriter().write("Login");
response.getWriter().write("</title>");
response.getWriter().write("</head>");
response.getWriter().write("<body bgcolor="aqua">");
response.getWriter().write("<center>");
response.getWriter().write("<h3>");
response.getWriter().write("欢迎你"+request.getParameter("account"));
response.getWriter().write("</h3>");
response.getWriter().write("</center>");
response.getWriter().write("</body>");
}
使用Cookie虽然实现了三天免登录的基础功能,但是,如果在用Cookie登录成功后需要重定向(两次请求,request对象不能携带数据)到另外一个Cookie时,request获取的值在重定向的Servlet中已经不再起作用了,访问的结果只能是空值。
(2)使用Session的请求共享功能,实现在不同的Servlet跳转过程中依旧能够通过request获得用户信息。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
Cookie[] cookies=request.getCookies();
Connection con=null;
login log= null;
int successNum=0;
try {
con= C3p0Utils.getConnection();
QueryRunner qr = new QueryRunner();
String sql = "Select * from login";
List<login> list = qr.query(con, sql, new BeanListHandler<login>((login.class)));
if(cookies!=null) {//验证数据库中是否有与Cookie对应的用户
for (int i = 0; i < list.size(); i++) {
log= list.get(i);
for (Cookie cookie : cookies) {
if((log.getAccount().equals(cookie.getName()))&&(log.getPassword().equals(cookie.getValue()))){
HttpSession httpSession=request.getSession();
httpSession.setAttribute("login",log);
successNum++;
}
}
}
if(successNum>=1){
response.sendRedirect("/Servlet_login_war_exploded/main");//重定向
}
else{
request.getRequestDispatcher("page").forward(request,response);
}
}
else{
request.getRequestDispatcher("page").forward(request,response);//请求转发
}
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
在通过Cookie登录成功后,创建了Session,对Session进行了赋值,而在重定向到MainServlet后,可以从Session中获取值。虽然在不同的Servlet中,是不同的请求,但是依旧能够通过Session获取值。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
login log= (login) request.getSession().getAttribute("login");
response.setContentType("text/html; charset=utf-8");//设置浏览器编码格式
response.getWriter().write("<html>");
response.getWriter().write("<head>");
response.getWriter().write("<title>");
response.getWriter().write("Login");
response.getWriter().write("</title>");
response.getWriter().write("</head>");
response.getWriter().write("<body bgcolor="aqua">");
response.getWriter().write("<center>");
response.getWriter().write("<h3>");
response.getWriter().write("欢迎你"+log.getAccount());
response.getWriter().write("</h3>");
response.getWriter().write("</center>");
response.getWriter().write("</body>");
}