SSH学习三 SESSION

一、session方法

Session:由同一个IE窗口向同一个WEBAPP发的所有请求的总称,一个会话

同一个会话的多个额请求可以从前到后多个请求。??祖给孙,孙不给祖

浏览器:搜集sessionID信息,并发到服务器。没有就不发送。

查找sessionID,若找到,看servlet是否需要session,需要就从服务器内存提取旧的session对象。否则维持旧的Session不动,修改session的使用时间。

如果没找到,看是否需要session,再创建session对象,并且保持session对象在服务器中,把sessionID写到IE中。

sessionID放到IE浏览器,浏览器通过request把id带到服务器端

HttpSession session = request.getSession(false);// 这里false只能用就得Session

True有旧的找旧的,否则建新的

Session.setMaxInactiveInterval两次请求之间的最长的时间间隔单位:s。相当于Session最大存活时间,超过之后服务器销毁这个session。比如登陆之后有一定时间,超出就销毁。0表示立即过期,-1表示永不过期

设置最大时间的原因:

(1)Session是容器,要长时间占用内存。所以限定最大时间间隔

(2)安全考虑

Session.isNew()是不是新的

自杀,用于安全退出或者清空购物车

以下参考:http://copperfield.iteye.com/blog/890018

session.invalidate()是销毁跟用户关联session,例如有的用户强制关闭浏览器,而跟踪用户的信息的session还存在,可是用户已经离开了。

虽然session 生命周期浏览默认时间30分,但是在30分钟内别的用户还可以访问到前一个用户的页面,需销毁用户的session。

session.removeAttribute()移除session中的某项属性。

在spring例子中宠物商店的注销登录的代码:

request.getSession().removeAttribute("userSession");

//    注销用户,使session失效。

request.getSession().invalidate();

二、session使用 以登录为例

业务逻辑:login.jsp提交表单,loginServlet判断用户名密码是不是对,如果不对转到login.jsp,如果对转到DealServlet(这个类判断是否登录还有效,无效就返回login,比如163邮箱),也可以通过该容器logout,可以logout返回login页面或者主页

UserLoginServlet

public class UserLoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String logid = request.getParameter("logid");
		String logpwd = request.getParameter("logpwd");

		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>logincontent</TITLE></HEAD>");
		out.println("  <BODY>");
		int flag=0;
		HttpSession session = request.getSession();
		if("Admin".equals(logid) && "123".equals(logpwd)){
			session.setAttribute("userid", logid);
			session.setMaxInactiveInterval(20);
			//System.out.println("here");
			//response.sendRedirect("http://localhost:8888/TestmyJSP/logout.servlet");
			response.sendRedirect("deal.servlet"); // 不是类名而是url
		}else{
			out.write("<script>alert('login error'); history.go(-1);</script>");
		}

		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}

DealLoginServlet

public class DealLoginServlet extends HttpServlet {

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 *
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 *
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");

		HttpSession session = request.getSession(false);

		if(session == null){
			response.sendRedirect("login.jsp");
		}else{
			Object o = session.getAttribute("userid");
			if(null == o){
				response.sendRedirect("login.jsp");
			}else{
				out.write(o.toString());
			}
		}
		out.println("<a href='logout.servlet'>登出</a> ");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}

LogoutServlet

public class LogoutServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		HttpSession session = request.getSession();
			session.setMaxInactiveInterval(0);
			session.invalidate();
			response.sendRedirect("login.jsp");	

		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 03:21:43

SSH学习三 SESSION的相关文章

SSH学习之二 OpenSSH配置文件解析

下面是对SSH配置文件的一些选项的分解说明,ssh_config是OpenSSH客户端的配置文件,sshd_config是OpenSSH服务器端的配置文件. ssh_config的内容如下: # This is the ssh client system-wide configuration file.  See ssh_config(5) for more information.  This file provides defaults for users, and the values c

Struts2框架学习(三) 数据处理

Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:ValueStack一种数据结构,操作数据的方式为:先进后出 OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技

JavaWeb学习总结——Session(转载)

JavaWeb学习总结--Session(转载) 一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务. 二.Session和Cookie的主要区别 Cookie是把用户的数据写给用户的浏览器. S

【git学习三】git基础之git管理远程仓库

1.背景 git管理远程仓库,本文以github为例. 2.管理远程仓库 1.本地ssh认证,在github建立一个repo叫做ospaf-GetWordFre 2.添加远程仓库,可以用git remote 命令实现,o是仓库名,可以用git remote -v查看 git remote add o git://github.com/jimenbian/ospaf-GetWordFre.git 3.接着就可以向github上fetch或是push代码了.注意要选择分支 /************

学习三十三

八周三次课(3月28日)10.32/10.33 rsync通过服务同步10.34 linux系统日志10.35 screen工具 扩展 Linux日志文件总管logrotate http://linux.cn/article-4126-1.html xargs用法详解 http://blog.csdn.net/zhangfn2011/article/details/6776925 rsync通过服务同步rsync可以增量拷贝,同时也支持远程同步rsync -av /etc/passwd /tmp

【Mac + Appium + Java1.8学习(三)】之IOS自动化环境安装配置以及简单测试用例编写(模拟器、真机)

前提条件: =========================================== 1.Xcode版本为Xcode10及以上2.Appium版本必须为1.9及以上,因为Xcode为10.0 3.appium-desktop4.安装所需依赖库,包括: a.Homebrew b.Git c.node (brew install node) d.npm (brew install npm)e.carthage (brew install carthage)f.libimobiledev

算法学习三阶段

?? 第一阶段:练经典经常使用算法,以下的每一个算法给我打上十到二十遍,同一时候自己精简代码, 由于太经常使用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都能够把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal 要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同一时候熟练hash 表(要熟,要灵活,代码要

Jetty学习三:配置概览-需要配置什么

上一节讲述了怎么配置Jetty,这节将告诉你使用Jetty你需要配置些什么. 配置Server Server实例是Jetty服务端的中心协调对象,它为所有其他Jetty服务端组件提供服务和生命周期管理.在标准Jetty发布中,核心的服务端配置是在etc/jetty.xml文件中,你也能在其中包含其他服务端配置,可以包括: 1)ThreadPool Server实例提供了一个线程池,你可以在etc/jetty.xml中配置最大线程数和最小线程数. 2)Handlers Jetty服务端只能有一个H

ZigBee学习三 UART通信

ZigBee学习三 UART通信 本实验只对coordinator.c文件进行改动就可以实现串口的收发. 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique message ID (counter) afAddrType_t GenericApp_DstAddr; unsigned char uartbuf[128];/**************************************************