第六课(JSP)-JSP的会话管理--用纯JSP实现对用户的鉴权

JSP—会话管理

在纯用JSP实现登陆和跳转会员页面时,存在一个问题:各个JSP页面在Tomcat上都有一个具体的绝对地址,若不对某些专门为会员提供服务的页面进行鉴权,则当非法用户获取到提供服务页面的绝对地址时,其只需要在浏览器地址栏上填写该绝对地址,则可绕过登陆界面而直接进入对应的会员服务界面,获取非授权的服务。

在上一课中,servlet对从登陆页面传过来的参数做了if判断,起作用就相当于对会员的身份进行鉴权:

if(username==null||username.equals("")||password==null||password.equals("")) {
			out.print("账号或密码不能为空");
		}
		else if(username.equals("JIA")){
			if(password.equals("123456789")) {
		out.print("登陆成功!欢迎你");
		out.print("<br>");
		out.print("NAME:"+username);
		out.print("<br>");
		out.print("PASS:"+password);
			}else {
				out.print("请输入正确的密码");
			}
		}else {
			out.print("请输入正确的账号");
		}

在该课中将实现纯用JSP实现用户从登陆页面->鉴权页面->会员服务页面的流程

登陆页面:login2.jsp

鉴权页面:check.jsp

会员页面:member.jsp

                                                         即:login2.jsp -> check.jsp -> member.jsp

Login2.jsp的源码:

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
 <form action="<%=path %>/check.jsp" name="login" method="get" ">
  		NAME: <input type="text" name="Name" maxlength="20" ><br><br>
  		PASS: <input type="password" name="Password"  maxlength="20"><br><br>
  		<input type="submit" name="Submit" value="login"><br>
  </form>

Check.jsp的源码:

<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<html>
<body>
  <%
request.setCharacterEncoding("GB2312");	
//设置字符编码
String userName = request.getParameter("Name");	
//接收login2页面表单参数
String userPWD = request.getParameter("Password");
String loginURL = "http://localhost:8080/helloworld/login.jsp";	
//指定输入错误跳转的页面
String memberURL = "http://localhost:8080/helloworld/mumber.jsp";	
//指定输入正确跳转的页面
if(userName == null || userPWD == null){	
//判断参数非空
	response.setHeader("Refresh","0;URL="+loginURL);		
	//为空则跳转至login2页面
}
if(userName.equals("JIA") && userPWD.equals("1234")){
	//非空且输入正确
	session.setAttribute("member",userName);	
	//向session中放入mumber属性,值为userName(即键值对)
	response.setHeader("Refresh","3;URL="+memberURL);	
	//跳转至会员页面
	out.println(userName+"欢迎登录,3秒后进入会员页面!");
}
else{
	response.setHeader("Refresh","3;URL="+loginURL);	
	//非空但输入账号密码错误,跳转回login2页面
	out.println("登录信息有误,请重新登录!");
}%>
</body>
</html>

Member.jsp的源码:

<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<html>
<body>
  <% String loginURL = "http://localhost:8080/helloworld/login.jsp";	
  //设一个变量存login2页面的url
  //用于非法用户在直到该具体服务页面的完整URL之后直接在浏览器地址栏中输入该完整URL
  //使得其在未登陆状态下就进入了会员页面
	 String member = (String)session.getAttribute("member");
	 //获取在check页面存储到session中的mumber属性值
	 //由调用session.getAttribute()时可知该函数返回值是一个object对象
	 //因此需要使用强转(member存储用户名,是String类型)
	 if(member == null){		//member为空
	 	response.setHeader("Refresh","3;URL="+loginURL);		//跳转回login2页面
	 	out.println("还未登录,请登录!");
	 }
	 else{		//非空,跳转至会员页面
	 	//因为在check页面中已经对member的合法性做过判断
	 	//所以该处只需要判断其非空,即可信任其为合法用户
	 	out.println("欢迎您"+member);
	 	session.invalidate();	
	 	//已经登陆了会员页面,就需要销毁session,避免后续被其他人恶意使用
	 }
%>
</body>
</html>

以上结构逻辑为:login2.jsp页面的表单提交表单数据给check.jsp页面,在check.jsp页面对用户的合法性进行鉴权,鉴权通过则跳转会员服务页面member.jsp,鉴权失败则跳转至login2.jsp

 

其中涉及到的知识点:

  1. 会话定义(百科)Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:(Cookie:SESSIONID=客户端第一次拿到的session ID)。这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。总结:对Web应用的一次连续的访问过程,从打开浏览器访问该Web应用开始一直到结束访问,中间可能包含着多次的请求/响应。
  2. 为什么需要会话管理
    • HTTP协议是无状态的通信协议
    • 每次的请求/响应都是独立的,每次请求/响应都不会“记住”前面的请求/响应
    • Web应用中需要持续的记住用户的一些信息或状态,比如已登录状态、已选购的商品等
  3. 会话管理的基本方式
    • 使用隐藏域、(即input标签的type=hidden),该文本框不会在浏览器中显示,但是它是实际存在的,会默默记录当前会话的全部信息,用于后续页面对前面页面数据的使用(将请求之间的联系信息保存在隐藏域中,在每次请求/响应之间传递)
    • 使用CookieCookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都记录下来。当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你
    • 使用URL重写:即通过在地址栏中+“?+键值对”来在不同的页面中传递参数,方便前面也页面的数据被后面页面使用,特别是get请求方式

 

以下所提及的session都是指HttpSession接口,是会话对象的抽象表示

Session即为c与s的会话,而隐藏域、cookie、url重写都是对session的管理方式,即怎么在各个页面直接传输session对象

 

  1. Sesson(会话):可用于存储用户本次访问会话的全部信息。

即客户端(浏览器)在向服务端(服务器)发送页面请求时,在服务器端建立一个session对象,该对象不是在用户请求的众多页面中某一个页面所私有的,而是被其中的许多页面所共有的(许多页面都可以对其中的属性进行set与get)。

  1. session中主要存储着当前会话产生的某些参数,比如上述使用的session.getAttribute("member")和session.setAttribute("member",member)分别用于向该用户的与其他用户相对独立的session中获取和存储member属性,session在建立之初就会初始化一些属性,这些属性标识了用户的一些初始信息,而在访问的过程中,程序员可以通过对应的set与get方法对session中的属性进行添加和获取。

 

就比如某宝/某东的购物车,购物车就好比一个session,首先每个人登陆之后拥有相互独立的互不相同的购物车,就如同服务器同时服务多个与用户(即service同时相应多个client的请求)则服务器会为每一个用户建立一个session对象存在服务器端;

当你在某宝/某东上浏览商品并加购之后,商品会存入你个人的购物车,并且在你浏览多个商品之后,购物车任然在,一直跟随你的操作到你浏览结束,则此时购物车中不再加入新的商品。该过程就如同用户在登陆页面login2页面时填写表单(如同商品)被提交至check也页面,在该页面向session中添加了member属性(即向购物车中添加商品),而check页面鉴权通过之后会跳转至member页面,而member页面需要检查session中的member属性是否为空(即在要支付购物车中某件指定商品之前,要确定购物车里面有没有这件指定的商品),有则提供服务(跳转至付款页面)

 

因为session中存储了大量的用户的信息,所以当用户不再需要时需要将对应的session进行及时的销毁,销毁session3种情乱:

  • session最大存活时间到了
  • 运行session.invalidate()方法
  • 服务器进程当掉

在某些浏览器中做了相应的安全优化,即当用户关闭当前会话浏览器页面之后,浏览器会自动告诉服务器将刚刚的session对象销毁,确保用户数据安全,下此会话再重新创建新的session对当次会话的数据进行存储。

 

  1. Session与cookie的区别:

即cookie是在客户端产生的用于存储session某些信息的一个存在本地C盘中的一个txt文件

Session是在服务器端产生的可用于存储当前会话产生的所有数据的一个对象

  1. 注意:
    • 默认情况下浏览器存储sessionId的cookie在浏览器关闭时将会失效,而HttpSession对象不会立即被注销。
  2. 设置会话最大自动失效时间:
    • setMaxInactiveInterval(int interval) 单位为秒
    • 在web.xml中设置session-config 单位为分钟
    • SessionCookieConfig接口的setAge()方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值