javaweb——Cookie&session

会话管理

目录

会话管理

1.会话概述:

2.会话功能

3.生命周期

4.会话技术

1.Cookie概述

2.Cookie常用方法

3.使用方式

案例:让用户登录后可以实现七天免登录。(新闻系统)

用户登录(未选择七天免登录复选框):

用户登录(选择七天免登录复选框):

session

1.session概述

2.session常用方法

案例:通过session拿到用户名

session和Cookie的区别

思维导图总结: 


1.会话概述:

双方的交流或交互,计算机中也是,浏览器和服务器的交互称之为会话。

注意点:一次会话中包含多次请求和响应(浏览器第一次给服务器资源发送请求,会话建立,知道有一方断开为止。)

2.会话功能

在一次会话的范围内的多次请求间,共享数据。
功能:
        限制页面的访问(后台的页面在非登录的情况下是不能进行访问的)
        临时的存储数据,在多次请求之间进行数据共享
        具体效果:记住密码,自动登录,7天免登等等陆

3.生命周期

开始
        浏览器访问服务器那一刻会话开始
结束
        浏览器或服务器一方中断时结束
注意事项:服务器一般处于持续运行状态,因此会话结束一般是浏览器关闭引起的。

4.会话技术

 最常见方案:数据库存储
    将数据存储到Cookie:数据由浏览器保存。
    将数据存储到session:数据由服务器保存。


1.Cookie概述

    (1)用来存储客户端的一小段文本
    (2)是一门客户端的技术,将数据保存到客户端;因为cookie是存储在客户端浏览器中的。
    (3)是为了实现 客户端与服务器端之间的状态的保持。
    (4)cookie技术,不安全,不要使用cookie存储敏感信息!比如登录状态和登录信息;
    (5)一些敏感的数据 应该存储在服务器端。

2.Cookie常用方法

        a. void setMaxAge(int e);
       设置Cookie有效期,单位秒,正数为多少秒后失效;负数表示当浏览器关闭时,Cookie将会被删除(争议);零表示清空Cookie
       b.  int getMaxAge();
       获取Cookie有的效时间,单位秒
       c. void setValue(String value);
       在Cookie创建后,对Cookie进行赋值
       d.String    getValue();
       获取Cookie的值
       e. String    getName();
       获取Cookie的名称
        f. Cookie[]    getCookies();
       获取Cookie中所有的属性名

3.使用方式

     (1)创建Cookie对象,绑定数据(在服务器端获取指定数据通过cookie保存)
  Cookie cookie = new Cookie(key,value);
    (2)发送Cookie对象(从服务端---》客户端)
  response.addCookie(cookie)
    (3)获取Cookie,获取数据
  Cookie [] cookies = request.getCookies()

注意事项:
      编码 URLEncoder.encode("字符串","utf-8");
      解码 URLDecoder.decode("字符串","utf-8");

案例:让用户登录后可以实现七天免登录。(新闻系统)

用户登录(未选择七天免登录复选框):

1.跳转到数据处理界面。

2.存在用户时,用户cookie保存用户名,通过重定向发送给主界面(是有客户端发出,数据也保存在客户端)

3.主界面会接收到用户名,进行相关使用。

用户登录(选择七天免登录复选框):

相比未选择,

会在数据处理界面中多出一处cookie处理时间,

在登录界面判断是否有cookie值,实现免登录的效果。

登录界面:

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!-- 实现自动登录 -->
	<%
		String username = null;
		//获取cookie
		Cookie[] cookies = request.getCookies();
		if(null!=cookies){
			for(Cookie cookie :cookies){
				if("username".equals(cookie.getName())){
					username = URLDecoder.decode(cookie.getValue(), "utf-8");
				}
			}
		}	
		if(username!=null){
			response.sendRedirect("admin.jsp");
		}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>新闻发布系统-管理员登录</title>
<!-- 引入login.css -->
<link rel="stylesheet" type="text/css" href="css/login.css" />
<!-- JavaScript 验证表单区域 -->
<script type="text/javascript">
	var code = "";//保存验证码
	//验证的需求:利用随机数  +拼接+数组存储需要随机的字符
	var arr = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
			'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ];
	function $(id) {
		return document.getElementById(id);
	}
	//加载函数
	window.onload = function() {
		//设置username的焦点事件
		$("username").onblur = function() {
			var usernameValue = this.value;
			if (!usernameValue) {
				alert('用户名不能为空')
				return false;
			}
			return true;
		}
		//设置password的焦点事件
		$("password").onblur = function() {
			var passwordValue = this.value;
			if (!passwordValue) {
				alert('密码不能为空')
				return false;
			}
			return true;
		}

		//获取表单设置表单的阻止提交事件
		$("myForm").onsubmit = function() {
			if (!$("username").onblur() || !$("password").onblur()
					|| !$("code").onblur()) {
				return false;
			}
			return true;
		}

		//获取验证码进行匹配
		$("code").onblur = function() {
			//获取输入项中的验证码
			var inputCode = this.value;
			//获取span标签随机生成保留的验证码
			var spanCode = $("code_val").innerHTML;
			if (!inputCode) {
				alert('验证码不能为空');
				return false;
			} else {//编写了验证码
				if (inputCode != spanCode) {
					alert('验证码输入错误');
					this.value = "";
					//重新生成
					return false;
				}
			}
			return true;
		};

		//问题:验证码的实现通过什么技术?
		//随机生成的验证码 有四个字母或者数字?    随机
		//javascript  随机器   Math.random()  0-1之间		

		//生成一个0-9的随机数
		/* var sj = Math.random()*10;
		// 向下取整 
		console.log(Math.floor(sj)); */

		setCode();

		/* 如果span中存储的验证码不清晰  需要重新修改  设置span的点击事件 */
		$("code_val").onclick = function() {
			setCode();
		}
	};

	//封装验证码生成
	function setCode() {
		//清空上一次保留的验证码
		code = "";
		//通过Math.random();产生一个随机数
		for (var i = 0; i < 4; i++) {
			/* 取范围 乘  数组的长度个数 */
			var sj = Math.floor(Math.random() * arr.length);
			//console.log(sj)
			//console.log(arr[sj]);  //根据随机数获取数组中的元素
			code += arr[sj];
		}
		//获取存储验证码的span标签
		$("code_val").innerHTML = code;
	}
</script>

</head>
<body>
	<!-- 登录大容器 -->
	<div id="login">
		<!-- 上 -->
		<div id="top">
			<div id="top_left">
				<img src="images/login_03.gif" />
			</div>
			<div id="top_center"></div>
		</div>
		<!-- 中 -->
		<div id="center">
			<div id="center_left"></div>
			<!-- 表单区域 -->
			<div id="center_middle" style="background: pink">
				<form id="myForm" action="doAdminLogin.jsp" method="post">
					<div id="user">
						用 户 <input type="text" id="username" name="username" />
					</div>
					<div id="pwd">
						密 码 <input type="password" id="password" name="password" />
					</div>
					<!-- 登录前需要验证码进行验证 -->
					<div id="yzm">
						验证码 <input type="text" name="code" id="code" /><span
							id="code_val">SBSB</span>
					</div>
					<!-- 区域留出来   7天免登录-->
					<div id="mdl">
						<label> <input type="checkbox" name="isCheck" value="auto">
						</label> <label>一周内免登录</label>
					</div>
					<div id="btn">
						<input type="submit" value="登录" /> <input type="reset" value="清空" />
					</div>


				</form>
			</div>
			<div id="center_right"></div>
		</div>
		<!-- 下 -->
		<div id="down">
			<div id="down_left">
				<div id="inf">
					<span class="inf_text">版本信息</span> <span class="copyright">管理信息系统
						2008 v2.0</span>
				</div>
			</div>
			<div id="down_center"></div>
		</div>

	</div>
</body>
</html>

数据处理界面:

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
	//该页面作用:根据request对象获取登录表单提交的值进行数据库交互

	//1.设置编码
	request.setCharacterEncoding("utf-8");
	//2.获取表单提交的值
	//用户名
	String username = request.getParameter("username");
	//密码
	String password = request.getParameter("password");
	//拿到复选框是否选中?  选中了  才能实现自动登录  
	String[] isChecks = request.getParameterValues("isCheck");
	//只需要判断isChecks这个数组是否为空,就能证明是否选中了复选框
	//System.out.println(isChecks);

	//3.数据库交互
	String uname = "";
	String pwd = "";
	//加载驱动
	Class.forName("oracle.jdbc.driver.OracleDriver");
	//建立连接
	String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	Connection conn = DriverManager.getConnection(url, "scott", "123");
	//sql
	String sql = "select * from tb_news_users where username = ? and password = ?";
	PreparedStatement ps = conn.prepareStatement(sql);
	ps.setString(1, username);
	ps.setString(2, password);
	ResultSet rs = ps.executeQuery();
	if (rs.next()) {//存在 就可以登录
		uname = rs.getString(1);
		pwd = rs.getString(2);
	}

	if ("" != uname && "" != pwd) {//数据库查到记录了   
		//判断如果选中了复选框    通过Cookie保存值
		//创建Cookie
		Cookie cookieUsername = new Cookie("uname", username);
		if (null != isChecks) {//选中了复选框------一周内免登陆
			//由于浏览器关闭后,会话中断,Cookie自动清除
			//设置时长  秒
			cookieUsername.setMaxAge(1 * 60 * 60 * 24 * 7);
		}
		//通过response响应对象写回客户端浏览器
		response.addCookie(cookieUsername);
		response.sendRedirect("admin.jsp");
	} else {
		//out.println(js)
		response.sendRedirect("doAdminLogin.jsp");
	}
%>

主界面:

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    	
    <!-- 通过include指令引入checkLogin.jsp页面检查是否登录 -->
    <%@ include file="checkLogin.jsp" %>
    
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>新闻发布系统-后台主页</title>
		<link rel="stylesheet" type="text/css" href="css/admin.css" />
	</head>
	<body>
		<div id="header">
			<div id="welcome">欢迎使用新闻管理系统!</div>
			<div id="nav">
				<div id="logo"><img src="images/logo.jpg" alt="新闻中国" /></div>
				<div id="a_b01"><img src="images/a_b01.gif" alt="" /></div>
			</div>
		</div>
		<div id="admin_bar">
			<div id="status">管理员:<%=username %> 登录 &#160;&#160;&#160;&#160; <a href="doout.jsp">login out</a></div>
			<div id="channel"> </div>
		</div>
		<div id="main">
			<div id="opt_list">
				<ul>
					<li><a href="admin.html">管&nbsp;&nbsp;理&nbsp;&nbsp;首&nbsp;&nbsp;页</a></li>
					<li><a href="add_news.jsp">新&nbsp;&nbsp;闻&nbsp;&nbsp;发&nbsp;&nbsp;布</a></li>
					<li><a href="admin_themeMaintain.html">主&nbsp;&nbsp;题&nbsp;&nbsp;维&nbsp;&nbsp;护</a></li>
					<li><a href="admin_themeMaintain.html">评&nbsp;&nbsp;论&nbsp;&nbsp;管&nbsp;&nbsp;理</a></li>
					<li><a style="color: red;" href="#">系统账号管理</a></li>
					<li><a style="color: red;" href="#">注册用户管理</a></li>
				</ul>
			</div>
			<div id="opt_area">
				<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
				<script language="javascript">
					function clickdel(nid) {
						//alert(id+"---"+typeof(id));
						//js传输参数  可以通过location.href进行页面跳转     do处理页面
						var flag = window.confirm("你确定要删除这篇新闻吗?");
						if(flag){
							//跳转
							window.location.href = 'doDelNews.jsp?nid='+nid;
						}
					}
				</script>
				<!-- 功能1:实现admin.jsp页面中新闻管理模块----模糊查询的搜索功能(根据标题进行模糊查询) -->
				<!-- 
					注意:在没有学习servlet时,模糊查询都是本页面
					问题:当输入关键词后,点击搜索按钮,跳转(1.do处理页面 2.admin.jsp)  admin.jsp
				
				
				 -->
				<div style = "width:100%;height:40px;text-align: center;line-height:40px; ">
					<form action = "admin.jsp" method = "post">
						<label>新闻标题</label>
						<!-- autocomplete 关闭自动提示 -->
						<input type = "text" name = "strName" autocomplete="off"/>
						<input type = "submit" value = "搜索"/>
					</form>
				</div>
				
				<%
					//1.运行admin.jsp之后,默认显示所有新闻。
					//2.在输入框中输入关键词点击搜索  跳转到本页面
					//通过request内置对象获取当前模糊查询表单提交的关键词
					
					//编码设置
					request.setCharacterEncoding("utf-8");
					String strName = request.getParameter("strName");
					//搜索的关键词为中文  获取时会出现乱码    通过String类进行编码和解码(得到我们看得懂的中文)
					System.out.println("模糊查询的关键词为:[解决前] "+strName);
					//sql语句
					String sql = "select * from tb_news";
					//第一次运行admin.jsp  strName为null  不能调用任何方法
					if(null!=strName){
						//new String(strName.getBytes("ISO-8859-1"),"utf-8");
						//将指定编码的字符串进行解码  通过getBytes("编码")   构造函数new String()编码
						strName = new String(strName.getBytes("ISO-8859-1"),"utf-8");
						//强调  电脑 有些电脑不需要第82行代码。
						//sql语句拼接模糊查询
						sql+=" where ntitle like '%"+strName+"%'";
					}
					System.out.println("模糊查询的关键词为:[解决后] "+strName);
				
					System.out.println("模糊查询的关键词为:[sql] "+sql);
				%>
				
				<!-- 需求:完成后台主页面的新闻显示绑定  start -->
				<ul class="classlist">
					<%
						//加载驱动
						Class.forName("oracle.jdbc.driver.OracleDriver");
						//建立连接
						Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott","123");
						
						//将sql语句传入方法返回执行对象
						PreparedStatement ps = conn.prepareStatement(sql);
						//根据执行对象调用方法返回结果集对象
						ResultSet rs = ps.executeQuery();
						//遍历结果集
						while(rs.next()){
							out.println("<li> <a href='admin_newsDetail.jsp?nid="+rs.getInt(1)+"'>"+rs.getString(3)+"</a> <span> 作者:"+rs.getString(4)+" &#160;&#160;&#160;&#160; <a href='admin_editNews.jsp?nid="+rs.getInt(1)+"'>修改</a> &#160;&#160;&#160;&#160; <a href='javascript:void(0)' onclick='clickdel(\""+rs.getInt(1)+"\")'>删除</a></span> </li>");
						}
						
					%>
					<li class='space'></li>
					<p align="right"> 当前页数:[1/3]&nbsp; <a href="#">下一页</a> <a href="#">末页</a> </p>
				</ul>
				<!-- 需求:完成后台主页面的新闻显示绑定  start -->
			</div>
		</div>
		
		
		<!-- 通过jsp中的include指令进行引入第三方页面 -->
		<%@ include file="foot.jsp" %>
		
		
	</body>
</html>

checkLogin.jsp界面:

<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    	//定义变量  保存登录的用户
    	String username = "";
    	//后台主页面获取到当前的Cookie对象中所保存的用户名  
    	
    	Cookie[] cookies = request.getCookies();
    	if(null!=cookies){
    		for(Cookie cookie:cookies){
    			if("uname".equals(cookie.getName())){
					username = URLEncoder.encode(cookie.getValue(), "UTF-8");
    				break;
    			}
    		}
    	}
    
    	//问题:后台页面不是随随便便能够访问,必须进行管理员登录才能进行访问
    	//判断:username为空  说明没有登录   cookie获取时  cookie.getValue不能赋值
    	if(""==username){//me米有登录
    		//送回去
    		response.sendRedirect("admin_login.jsp");
    	} 
    	
    	
    %>

session

1.session概述

session是属于jsp9大内置对象之一
    (1)服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象。jsp:session  servlet:HttpSession。
    (2)通过Session可以在应用程序的WEB页面间进行跳转时,保存用户的状态,使整个用户会话一直存在下去,直到关闭浏览器。
    
注意事项:客户端长时间不向服务端发出请求,Session对象就会自动消失。这个时间取决于服务器,例如,Tomcat服务器默认为30分钟。

2.session常用方法

    a.public void setAttribute(String name,String value);
    ** 设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性是会话范围内存在,则更改该属性的值。  
    b.public Object getAttribute(String name);
    ** 在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。  
    c.public void removeAttribute(String name);
    ** 删除指定名字的session属性,若该属性不存在,则出现异常。
    d.public void invalidate();
    ** 使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。  
    e.public String getId( );
    ** 获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。
    f.public void setMaxInactiveInterval(int interval);
    ** 设置会话的最大持续时间,单位是秒,负数表明会话永不失效。  
    g.public int getMaxInActiveInterval();
    **获取会话的最大持续时间,使用时候需要一些处理 。

案例:通过session拿到用户名

保存用户名界面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		
		//通过session保存用户名
		session.setAttribute("username", "张无忌");
	%>
	
</body>
</html>

拿到用户名界面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	<%
		//获取session
		String str = (String)session.getAttribute("username");
		out.println(str);
	%>


</body>
</html>

session和Cookie的区别

    (1)session存储数据在服务端,Cookie在客户端。
    (2)session是一个内置对象,其属性也可以是任何类型,而Cookie对象只能设置字符串。
    (3)session没有数据大小限制,Cookie有数据大小限制。
    (4)session数据安全,Cookie相对于不安全。

个人觉得session使用起来更方便,但是一些功能需要Cookie技术。


思维导图总结: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小羊持续开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值