欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jsp(5):会话Session的使用,跟踪用户

程序员文章站 2022-03-01 18:43:02
...

应用场景:用户登陆我们的网址后,下次登陆时会自动显示用户的登陆名称。这就是“跟踪用户”技术,目前使用最多的是利用session实现跟踪用户信息。


Session是什么?

jsp的内置对象之一。JSP通过request对象控制用户浏览器的请求,通过response对客户浏览器进行响应;

session就是维持这个反反复复的会话期间需要传递的数据信息。 


起止时间

打开浏览器访问服务器后开始创建session对象,关闭浏览器后本项目的session才消失。

(注:与浏览器页面开关无关,与整个浏览器有关)


简单demo:使用session保存我们对该页面的访问次数

                (jsp中直接使用内置对象session)

...
<body>
<%
	int num=1;        //初始化次数为1
	if(session.getAttribute("count")!=null){        //若已经session已经建立,则num+1
		String n=(String)session.getAttribute("count");        
	        num=Integer.parseInt(n)+1;               
	}
	session.setAttribute("count",num+"");		//在session保存num
%>
当前点击了<%=num %>次页面
</body>
...

效果:每次刷新一次eclipse的内置浏览器就能观察到num在增加。

· num不是局部变量么?(详见教程1)为什么刷新的时候局部变量没有重新赋值?

因为session啊,只要我们没关闭浏览器,session中的值就一直不会释放掉,刷新是没有用的。强调,是关闭浏览器,我们本项目的session才会消失,如果我们关闭了浏览器的当前页面,session仍然存在,不信可以自己去QQ浏览器、火狐浏览器等浏览器自行访问项目地址测试下。(例如:http://localhost:8080/Test/hhhh.jsp。不推荐使用eclipse的内置浏览器测试,鸡肋)

· 为什么session.setAttribute()中的num要num+"",从int变成string类型?

因为该函数接受一个object(String或者Integer),这里我们把int这样转型为string(也可尝试转Integer或其他方法)。

存值的时候用的是String,取值取得也是String,这就是为什么我们getAttribute后要强转的原因了。


实用场景Demo

防止“非正规登陆”:demo大部分代码借鉴前几节博客的内容。部分改动。login.jsp:不变

check.jsp :    判断用户名密码是否匹配,是否登陆成功

....
<body>
<%
	String username = request.getParameter("user");
    String password = request.getParameter("psw");
    if(username.equals("admin")&&password.equals("123"))
    {
    	//密码正确,登陆成功,建立会话session,跳转到欢迎界面
    	session.setAttribute("user", username); 	
    	response.sendRedirect("welcom.jsp"); 
    }
    else{
    	//密码不对,跳转回登录页面
    	response.sendRedirect("login.jsp"); 
    }
%>

</body>
....

welcome.jsp:    如果用户登陆成功,就转入“欢迎”界面,并且可以点击超链接更改我们自己的博客内容。

...
<body>
welcome 
<%
	out.print(session.getAttribute("user"));
%>
<br>
<a href="rewrite.jsp">重写我的博客</a>
</body>
...

rewrite.jsp:    假设在这里实现更改我们博客的操作。

....
<body>
正在重写博客...
</body>
...

运行:从login.jsp运行,输入admin,123,发现一切正常~

但是!现在我们关闭并再次打开我们的浏览器,访问rewrite.jsp的地址(例如我的:http://localhost:8080/Test/rewrite.jsp),

你会发现就算你没登陆,你也可以执行用户登录后才有的“重写博客”操作。

这时候我们可以通过判断用户是否通过了正规的登陆检验check.jsp,是否建立了session来阻止非法访问游客博客空间的行为。

即可以更改rewrite.jsp代码:

.....
<body>
<%-- <jsp:include page="checkvalid.jsp" flush="true"></jsp:include> --%>
<%-- <%@include file="checkvalid.jsp" %>	 --%>
<%
if(session.getAttribute("user")==null){
%>
	<jsp:forward page="login.jsp" ></jsp:forward>
<%	
}
%>
正在重写博客...
</body>
...

这时候我们再关闭,重新打开我们的浏览器访问rewrite界面,就会发现我们因为没有通过正常登陆渠道建立与服务器的session,无法执行“重写博客”操作,我们被强制返回登陆页面操作了~

关于注释中的checkvaild.jsp,如果对前文中提到的坑感兴趣的,可以自己试试。

<%
if(session.getAttribute("user")==null){
%>
	<jsp:forward page="login.jsp" ></jsp:forward>
<%	
}
%>

虽然到这里看起来就完美了,但是仔细一思考:

用户登陆后的操作一般都有好多个的,除了“重写博客”外,还有“查看访问量”、“删除博客”....等操作,难道我们每次写这些操作的界面时,都要判断一次session.getAttribute()是否为空?为空就返回到login.jsp?这不是代码冗余了嘛!还好我们有重写、过滤器可以解决这个问题。(后面章节再提)

上面那个demo是在jsp中直接使用,但是后面我们会讲到servlet之类的纯java代码,在Java中是不能使用jsp的内置对象的,所以如果在java代码中怎么使用session呢?这就需要创建对象来使用,这里以HttpSession 为例子。

HttpSession session=request.getSession();
session.setAttribute("username", username);