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