当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2021-06-25
应用场景 :用户登陆我们的网址后,下次登陆时会自动显示用户的登陆名称。这就是“跟踪用户”技术,目前使用最多的是利用session实现跟踪用户信息。 Session是什么? jsp的内置对象

应用场景:用户登陆我们的网址后,下次登陆时会自动显示用户的登陆名称。这就是“跟踪用户”技术,目前使用最多的是利用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);
网友评论