Java会话技术

会话:用户打开浏览器,浏览页面,直到关闭浏览器的过程称为一次会话。
为什么要学习会话技术?
http协议是一个无状态协议,服务器端无法记录客户端浏览器身份信息。
例如:购物网站,购物车(需要记录用户购买商品的信息)。
如何做到? request? 无法实现,会发现结账时,没有任何商品信息。
ServletContext? 无法实现,结账时会发现,所有人的商品
信息都在购物车中。
在这里插入图片描述
会话跟踪技术包括: Cookie(客户端技术)
Session(服务器端技术)

在这里插入图片描述
二、1、Cookie简介
在这里插入图片描述
常见的使用场景:记住密码
作用:将数据存储到本地为了智能填充数据,还能够增强用户体验,缓解服务器压力。
(1) Cookie在哪?
如果想查看所有本地已经缓存的Cookie
Google 浏览器设置 - 高级 - 内容设置 - cookie -
在这里插入图片描述
删除所有的本地Cookie 方法
Ctrl + shift + Delete
在这里插入图片描述
怎样给网站缓存数据
增加Cookie的方法
Cookie cookie = new Cookie(“uname”,“老王”);
浏览器设置cookie
response.addCookie(cookie);

response 是可以将信息返回到浏览器上,所以设置cookie的时候是借助response对象将cookie发送到本地浏览器。
获取Cookie的方法时通过request进行获取)不支持按个获取request方法会直接将所有的Cookie全部取到并且返回一个数组
Cookie co [] = request.getCookies();
if (null != co){
for(Cookie cookie : co){
if(“uname”.equals(cookie.getName())){
将这个uname的值放在页面作用域中
pageContext.setAttribute(“uname”,cookie.getValue());
}
}
}
当前用户是:${uname}

Cookie的常用方法
1.构造Cookie时,name和value都是字符串。注意:不能用中文字符串

2.getName()获得Cookie的name

3.getValue()获得Cookie的Value 注意:Cookie没有提供根据key获取value的方法

4.setMaxAge(int 秒) 设置Cookie的存活时间

5.setPath()设置Cookie的有效路径

浏览器将Cookie保存硬盘的路径,是各个浏览器自己制定,其他无法进行操作的。

有效路径:浏览器发送请求时,cookie的代入路径

请求路径等于或者包含cookie的有效路径,该cookie会在请求时被代入。

请求路径是从资源位置开始进行判断

方法名 :setPath(java.lang.String uri)

设置有效路径。
设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。
例如:setPath("/web/a/b");
http://localhost:8080/web/a/b/oneServlet,可访问(当前路径)
http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径)
http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径)
 常见设置:setPath(“/”) ,当前tomcat下的所有的web项目都可以访问
7 获得客户端带过来的Cookie
Cookie[] cs = request.getCookies()
8 服务器端把Cookie带到客户端
response.addCookie(cookie);

3、Cookie的案例
(1) 利用Cookie记录客户端是否是第一次访问
需求:创建一个FirstCookieServlet 客户端访问这个Servlet
如果是第一次访问这个Servlet 显示 欢迎第一次访问
如果不是第一次访问这个Servlet 显示 欢迎回来
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	// 判断浏览器端是否带有指定的cookie
	// 如果没有,那么是第一次访问。显示第一次访问,创建一个cookie 返回给客户端
	// 如果有cookie 则不是第一次访问 显示欢迎回来
	
	response.setContentType("text/html;charset=utf-8");
	PrintWriter out =response.getWriter();
	
	Cookie[] cs = request.getCookies();
	Cookie c = CookieUtils.getCookieByName("visited", cs);
	
	
	if(c!=null){
		out.println("<h1>欢迎回来</h1>");
	}else{
		out.println("<h1>欢迎第1次访问</h1>");
		Cookie cc = new Cookie("visited","true");
		response.addCookie(cc);
	}
}

(2) 利用Cookie记录客户端上次访问时间
1.接收客户端带过来Cookie的信息
2.从数组中查找指定名称Cookie,如果找不到(第一次访问),输出一个欢迎
如果找到了(不是第一次),取出上次的访问时间,显示到页面
3.记录系统当前时间
4.利用Cookie回写当前时间
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	/*
	 接收客户端带过来Cookie的信息 
                    从数组中查找指定名称Cookie,如果找不到(第一次访问),输出一个欢迎,把当前时间使用Cookie写给客户端
            如果找到了(不是第一次),取出上次的访问时间,显示到页面,把当前时间写入Cookie  写给客户端
	 */
	
	response.setContentType("text/html;charset=utf-8");
	PrintWriter out =response.getWriter();
	
	Cookie[] cs = request.getCookies();
	
	Cookie c = CookieUtils.getCookieByName("lastVisitedTime", cs);
	
	if(c!=null){
		out.print("<h1>上次访问时间为: "+c.getValue());
	}else{
		out.print("<h1>欢迎第一次访问</h1>");
	}
	
	Date d = new Date();
	String now = DateUtils.dateToString(d);
	
	Cookie cc = new Cookie("lastVisitedTime",now);
	
	cc.setMaxAge(10000);
	cc.setPath("/");
	
	response.addCookie(cc);
}

(3)记录用户名
protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	String username = request.getParameter("username");
	String password = request.getParameter("password");
	
	String record = request.getParameter("record");
	int num = Integer.parseInt(record);
	
	UserService service = new UserServiceImpl();
	User user = service.login(username, password);
	
	if(user!=null){ // 登录成功
		
		if(num!=0){
			
			String newname = URLEncoder.encode(user.getUsername(), "UTF-8");
			
			
			Cookie c = new Cookie("username",newname);
			c.setMaxAge(num*24*60*60);
			c.setPath("/");
			response.addCookie(c);
			
		}
		
		response.sendRedirect("main.jsp");
		
	}else{  //登录失败
		//request.setAttribute("msg", "用户名或密码错误!!!");
		response.sendRedirect("login.jsp?msg=loginerror");
	}
}
用户名或密码错误

<%
String str = CookieUtils.getCookieByName(“username”, request.getCookies()).getValue();
String name = URLDecoder.decode(str,“UTF-8”);
%>

username:
password:
recordusername: 不记录 7天 30天
(4)记录浏览记录

三、Session
1、Session简介
服务端会话技术
Servlet规范下的一个组件,全称HttpSession,同时也是一个作用域。
生活中实例
登录网站,关闭浏览器之后会提示你重新登录。
如何做到关闭浏览器后通知你重新登录。

Session作用域的特性
存放的值可以跨页面,只要你不关闭浏览器那么你的作用域的值就一直存在。也就意味着会话不结束session长存(可以设置最大存活时间)。

实际项目中如何实现访问页面拦截
在登录成功之后,将用户的ID或者对象存到Session中,如果访问页面的时候判断Session中存在这个ID 意味着现在已经登录可以访问本页面,如果ID获取不到,意味着没有登录。
2、获取Session
方式一: HttpSession session = request.getSession()
如果session还没有创建,则创建。
如果已经创建,则使用已经创建的session。
方式二: HttpSession session = request.getSession(false);
如果session已经创建过,则使用已经创建的session。
如果session没有创建过,则返回null。
Session的getId() 方法可以获得Session的id
3、Session常用方法
session.setAttribute("",Object);
session.getAttribute("");
session.removeAttribute("");
4、Session的创建和销毁
(1) Session的创建
在某个会话下,第一次调用getSession()为本次会话创建Session
(2) Session的销毁
浏览器关闭Session对象并没有销毁(指向Session的保存着Session的id的Cookie就不存在了,也就再也不能访问到之前的Session对象了。Session对象变成了垃圾)
只不过是存放这个Session的Id的Cookie销毁了,导致Session对象获得不到了。
1 关闭服务器(非正常关闭服务器)
(如果是正常关闭服务器,Session将被序列化到服务器中)
tomcat\work\Catalina\localhost\1202Session\SESSION.ser

	 2  session时间到期 session的默认存活时间是30分钟
         默认配置在tomcat的web.xml中
			 <session-config>
               <session-timeout>30</session-timeout>
             </session-config>
         可以在自己的web.xml配置Session的过去时间,配置方式和tomcat的web.xml中配置方式相同。
	 3 调用session 的  invalidate()方法
        还能够获得到session的id值,但session的其他方法就不能调用了

5、案例:用户登录

1、如果用户没有登录,需要跳转到login.jsp
2、如果用户登录了,允许访问任意本项目页面,并且在页面中显示登录的账号
3、如果关闭浏览器,需要重新登录。

实现步骤:
1、用户登录成功之后将名称保存到session中

2、在本项目各个页面获取用户账号

任何本项目的页面都可以访问
3、关闭服务器后者关闭浏览器,再次访问非登录,跳转到登陆页面中。

关闭浏览器之后直接不让访问其他直接给跳转到了Login.JSP页面

4、Session信息
session 的活化与钝化功能。
简单说明:
活化:将session从本地读取到内存中 (启动服务器的时候)
钝化:从内存中将数据保存到本地硬盘 (关闭服务器的时候)
session一般都保存一些非常重要的数据,开发者为了不会因为服务器异常关闭导致内存中的数据丢失,会将数据钝化到本地。 重启后直接恢复到内存中。 数据一直存在。

Tomcat服务器默认支持session活化与钝化功能。

6、Session和Cookie的区别和联系
1.数据存储的位置不同 Cookie在客户端 Session在服务器端
2.生命周期不同
Cookie(会话(瞬时)Cookie浏览器关闭 持久化Cookie setMaxAge(秒数))Session(默认30分钟,可以修改)
3.cookie只能存放字符串名值对(都是字符串),session可以是任意对象
4.同一个浏览器接受cookie的个数是有上限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值