Download presentation
Presentation is loading. Please wait.
1
第七章 JSP页面的访问控制
2
回顾 使用JSP编程时,如何在服务器端获得用户在文本框中输入的数值? 什么是JSP内置对象?列举一些常用的JSP内置对象,并说明它们的作用
3
预习检查 请说明JSP内置对象session与application的区别 include指令的作用是什么?
4
本章任务 完成最终版的新闻发布系统 为新闻发布系统增加访问控制 为新闻发布系统增加已访问人数统计 实现新闻发布系统的分级浏览
5
本章目标 掌握访问控制实现的流程 掌握JSP内置对象的用法 掌握include指令 掌握如何在超链接中传递参数 session对象
application对象 掌握include指令 掌握如何在超链接中传递参数
6
生活中的访问控制 下载电子书时,系统会提示用户登录网站 点击下载, 系统转入登录页面 每次下载之前,系统如何判断用户是否已经登录?
7
如何实现访问控制 访问控制流程图: 1 2 系统如何保存不同用户的登录信息? 进入用户注册页面 否 用户登录 是否是注册用户
系统保存该用户的登录信息 进入欲访问的页面 是 进入用户登录页面 否 用户直接访问某个页面 2 系统是否保存了该用户登录信息 显示该页面内容 是 系统如何保存不同用户的登录信息? 使用JSP会话跟踪机制,可以维持每个用户的会话信息,也就是为不同的用户保存不同的数据
8
什么是会话 一个会话就是浏览器与服务器之间的一次通话,它包含浏览器与服务器之间的多次请求、响应过程
session是JSP内置对象,与浏览器一一对应,允许用户存储和提取会话状态的信息 请求 1 浏览器 响应 1 session对象 请求 2…n 浏览器 响应 2…n session对象 浏览器关闭,本次会话结束
9
JSP内置对象session session对象用来存储有关用户会话的所有信息 session对象常用方法:
void setAttribute(String key, Object value):以键/值的方式,将一个对象的值存放到session中 Object getAttribute(String key):根据名称去获取session中存放对象的值 session.setAttribute("name", "admin"); String name = (String) session.getAttribute("name"); 访问控制就是基于session来完成的
10
为新闻发布系统增加访问控制 4-1 升级新闻发布系统,增加访问控制功能,具体要求如下: 2 1 3 提供用户登录页面
用户必须登录之后,才能访问新闻发布系统 登录处理页面(login.jsp) 1、获得登录信息 2、查询数据库,判断该用户是否注册 3、如果该用户已注册,在session中保存该用户的登录信息,并且跳转到新闻发布系统的首页面 2 1 session中无法 提取到用户信息 新闻发布系统首页面(index.jsp) 1、从session中提取该用户信息 2、如果用户信息存在,显示首页内容 3、如果用户信息不存在,跳转到登录页面 用户已注册 3
11
为新闻发布系统增加访问控制 4-2 在news数据库中创建表userinfo,负责存储用户名、密码
创建类(User.java),负责存储用户名、密码 创建登录页面(login.html) 创建登录处理页面(login.jsp) 完整代码实现 完整代码实现 完整代码实现 ------登录处理页面的代码片断------ <% if (rs.next()) { //如果是已注册用户 //把用户名、密码封装在User对象中 User loginedUser = new User(name, pass); session.setAttribute("LOGINED_USER", loginedUser); response.sendRedirect("index.jsp"); } else { response.sendRedirect(“login.html"); } %> 在session中存放用户登录信息
12
为新闻发布系统增加访问控制 4-3 完整代码实现 在新闻发布系统后台首页面(index1.jsp)中加入登录验证 <%
User user = (User) session.getAttribute("LOGINED_USER"); if (user == null) { response.sendRedirect(“login.html"); } %> 如果session中不存在该用户的登录信息,转入登录页面 完整代码实现
13
为新闻发布系统增加访问控制 4-4 访问控制效果验证,步骤如下: 每个步骤会发生什么样的结果?为什么会产生这样的结果?
直接在IE地址栏中输入URL,访问系统首页面 通过登录页面进入系统首页面 重新开启一个IE窗口,直接访问系统首页面 每个步骤会发生什么样的结果?为什么会产生这样的结果? 演示:访问控制效果验证 每个session对象都与浏览器一一对应 重新开启一个浏览器,相当于重新创建一个session对象
14
include指令 2-1 除了首页面,其它页面中同样需要加入登录验证, 有没有办法避免冗余代码的出现?
除了首页面,其它页面中同样需要加入登录验证, 有没有办法避免冗余代码的出现? 可以将一些共性的内容写入一个单独的文件中,然后通过include指令引用该文件,从而降低代码的冗余问题,也便于修改共性内容
15
include指令 2-2 创建登录验证文件 checklogin.jsp
在后台首页面(index.jsp)中使用include指令引用登录验证文件 page import="s2jsp.sg.ch07.User"%> <% User user = (User) session.getAttribute("LOGINED_USER"); if (user == null) { response.sendRedirect(“login.html"); } %> 完整代码实现 include file="checklogin.jsp"%>
16
小结1 创建登录页面login.html 创建登录处理页面login.jsp 创建页面index.jsp login.html
提供用户名输入框、以及登录按钮 创建登录处理页面login.jsp 如果用户名为sa,把用户名存储在session中,并跳转进入index.jsp中 否则跳转进入login.html页面 创建页面index.jsp 如果session中没有该用户信息,跳转进入login.html中 否则显示欢迎信息 login.html login.jsp index.jsp
17
升级新闻发布系统,增加已访问人数统计功能,具体要求如下:
为新闻发布系统增加已访问人数统计 4-1 升级新闻发布系统,增加已访问人数统计功能,具体要求如下: 左导航页面中增加超链接:已访问人数统计 已访问人数统计页面:显示已访问人数,以及访问者的登录名称 4 1 3 2 登录处理页面(login2.jsp) 1、在session中保存该用户信息 2、在全局范围内保存该用户信息 3、跳转到新闻发布系统的首页面
18
为新闻发布系统增加已访问人数统计 4-2 完整代码实现 创建登录页面(login2.html) 创建登录处理页面(login2.jsp)
------登录处理页面代码片断------ if (rs.next()) { User logineduser = new User(name, pass); session.setAttribute("LOGINED_USER", logineduser); List loginedUsers = new ArrayList(); //访问者列表 if (application.getAttribute("LOGINED_USER") != null) loginedUsers = (List) application.getAttribute("LOGINED_USER"); loginedUsers.add(logineduser); //把新登录用户的信息存入访问者列表中 application.setAttribute("LOGINED_USER", loginedUsers); response.sendRedirect("index.jsp"); } 从全局范围内取出原有的访问者列表 在全局范围内存入访问者列表
19
在新闻发布系统左导航栏中加入超链接(left.jsp) 创建已访问人数统计页面(showAllLoginedUsers.jsp)
为新闻发布系统增加已访问人数统计 4-3 完整代码实现 在新闻发布系统左导航栏中加入超链接(left.jsp) 创建已访问人数统计页面(showAllLoginedUsers.jsp) 完整代码实现 ------已访问人数统计页面代码片断------ <% List loginedUsers = new ArrayList(); //访问者列表 if (application.getAttribute("LOGINED_USER") != null) loginedUsers = (List) application.getAttribute("LOGINED_USER"); %> 目前,有<%=loginedUsers.size()%>人已经访问过本网站!<br><br> 访问者的登录名称分别是:<br> <% for (int i = 0; i < loginedUsers.size(); i++) { User logineduser = (User) loginedUsers.get(i); out.print(logineduser.getName()); out.print("<br/>"); } %> 从全局范围内取出访问者列表 逐行显示每个访问者的登录名称
20
每个步骤会发生什么样的结果?为什么会产生这样的结果?
为新闻发布系统增加已访问人数统计 4-4 已访问人数统计效果验证,步骤如下: 通过登录页面进入系统首页面,查看已访问人数统计 重新开启一个IE窗口,使用不同的用户登录进入首页面,查看已访问人数统计 每个步骤会发生什么样的结果?为什么会产生这样的结果? 演示:已访问人数统计的效果验证
21
JSP内置对象application application类似于系统的“全局变量”,用于实现用户之间的数据共享
void setAttribute(String key, Object value):以键/值的方式,将一个对象的值存放到application中 Object getAttribute(String key):根据键去获取application中存放对象的值 application.setAttribute("LOGINED_USER", new ArrayList()); if (application.getAttribute("LOGINED_USER") != null) { List loginedUsers = (List) application.getAttribute("LOGINED_USER"); }
22
新闻发布系统的分级浏览 4-1 实现新闻的分级浏览功能,具体要求如下: 在新闻发布系统的前台首页面上,显示所有新闻一级标题
为所有新闻一级标题设置超链接,点击后,显示下属的新闻二级标题 “体育”对应的超链接 第九章jsp动态生成超链接 改处理URL请求参数 点击“体育” “体育”下属的新闻二级标题列表
23
新闻发布系统的分级浏览 4-2 创建前台首页面(newspre.jsp) 完整代码实现 使用表格把页面分为三块:上栏、左下栏、右下栏
上栏显示图片 左下栏显示新闻一级标题,提取到一个单独的文件showFirstTitle.jsp中 右下栏显示新闻二级标题,提取到一个单独的文件showSecondTitle.jsp中 使用include指令引入这两个文件 完整代码实现 上栏 左下栏 右下栏
24
新闻发布系统的分级浏览 4-3 完整代码实现 创建新闻一级标题的浏览页面(showFirstTitle.jsp )
代码片断------ <% //从数据库中获取所有新闻一级标题,并逐行显示 FirstLeveTitleDbOpreation first = new FirstLeveTitleDbOpreation(); List list1 = first.getAllFirstLevelTitleList(); if (list1!=null && list1.size() != 0) { for (int i = 0; i < list1.size(); i++) { FirstLevelTitle fTitle = (FirstLevelTitle) list1.get(i); %> <div align="center"><a href ="newspre.jsp?parentId=<%=fTitle.getId()%>"> <%=fTitle.getTitleName()%></a></div><br> <% } } 超链接中传递参数:新闻一级标题的ID
25
新闻发布系统的分级浏览 4-4 在类SecondLevelTitleDbOpreation中添加方法getSecondByFirst(),根据新闻一级标题的ID获取对应的新闻二级标题 创建新闻二级标题的浏览页面(showSecondTitle.jsp) 根据新闻一级标题的ID,显示对应的新闻二级标题 完整代码实现 完整代码实现 代码片断------ <% String strParentId = request.getParameter("parentId"); if (strParentId!=null){ int parentId = Integer.parseInt(strParentId); //根据新闻一级标题ID获取下属的新闻二级标题列表 List list2 = new SecondLevelTitleDbOpreation() .getSecondByFirst(parentId); } %> 处理URL中的请求参数:得到新闻一级标题的ID 演示:新闻发布系统的分级浏览
26
小结2 创建JSP页面one.jsp 创建JSP页面two.jsp one.jsp完整代码实现 two.jsp完整代码实现
向two.jsp传递一个参数,参数名为str,其值为字符串hello 创建JSP页面two.jsp 在该页面中输出参数的值 one.jsp完整代码实现 two.jsp完整代码实现
27
总结 启动IE窗口运行如下JSP,如果连续刷新5次,输出结果是什么?
page contentType="text/html; charset=GBK"%> <% Integer ival = (Integer)session.getAttribute("counter"); if (ival == null) ival = new Integer(1); else{ ival = new Integer(ival.intValue() + 1); session.setAttribute("counter", ival); } %> <%=ival%> 第一次输出: 5 第二次输出: 3
28
Thank you
Similar presentations