JSP页面的访问控制_第1页
JSP页面的访问控制_第2页
JSP页面的访问控制_第3页
JSP页面的访问控制_第4页
JSP页面的访问控制_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JSP页面的访问控制1.1 访问控制1.1.1 如何实现访问控制如图1.1和图1.2所示是系统进行访问控制的两种情形。在图1.1中,用户通过登录页面登录网站,如果该用户是已注册用户,系统会保存该用户的登录信息,并让用户进入其欲访问的页面。在图1.2中,用户直接访问网站的某个页面,系统会去查询是否保存有该用户的登录信息,如果有,则显示该页面的内容,如果没有,就转入登录页面,要求用户登录网站。图1.1访问控制流程(1)图1.2访问控制流程(2)JSP为提供了一套会话跟踪机制,该机制可以维持每个用户的会话信息。也就是说,使用会话跟踪,可以为不同的用户保存不同的数据。1.1.2 什么是会话就Web开发

2、来说,一个会话就是用户通过浏览器与服务器之间进行的一次通话,它包含浏览器与服务器之间的多次请求、响应过程。如图1.3所示描述了浏览器与服务器的一次会话过程。当用户向服务器发出第一次请求时,服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束(浏览器关闭,本次会话结束)。浏览器请求11浏览器请求2n响应2n图1.3一次会话过程JSP提供了一个可以在多个请求之间持续有效的会话对象session , session对象允许用户存储和提取会话状态的信息。接下来,就来学习JSP内置对象 session1.1.3 JSP内置对象session在JSP中,提供了一个内置对象session,sessi

3、on对象用来存储有关用户会话的所有信息。session对象的常用方法如下:?voidsetAttribute(Stringkey,Objectvalue):以键/值的方式,将一个对象的值存放到session中去。例如:session.setAttribute("name","admin");就是把字符串admin存放到session中去,它对应的键是name。?ObjectgetAttribute(Stringkey):根据键去获取session中存放的对象的值。例如:Stringname=(String)session.getAttribute(&qu

4、ot;name");就是通过名称为name的键获取session中存放的对象的值。在JSP中,访问控制就是基于session对象来完成的,接下来,就使用JSP内置对象session为新闻发布系统增加访问控制。1.1.4 为新闻发布系统增加访问控制现在升级新闻发布系统,增加访问控制功能,要求系统提供用户登录页面,所有用户必须登录之后,才能访问新闻发布系统。访问控制流程如图1.4所示。1c用户我章-图1.4新闻发布系统的访问控制流程根据新闻发布系统的访问控制流程,至少要完成如下几个步骤。(1)在news数据库中创建表userinfo,负责存储用户名、密码。(2)创建类(User.java

5、),负责存储登录用户的信息,如用户名、密码。(3)创建登录页面(login.html)。(4)创建登录处理页面(login.jsp)。(5)在新闻发布系统首页面中加入登录验证。下面,就逐步完成这项升级任务。首先,在news数据库中创建表userinfo,表结构见表1.1。表1.1数据表userinfo字段名称字段说明数据类型大小loginName用户名称varchar50password密码varchar50接下来,创建类User.java,用来存储已登录用户的用户名和密码,代码实现如示例1所示。示例1packages2.java.web.sg1.entity;publicclassUserp

6、rivateStringname;/用户名privateStringpassword;/密码3 / 19/*构造函数*paramname用户名*parampassword密码*/publicUser(Stringname,Stringpassword)=name;this.password=password;/*返回用户名*/publicStringgetName()returnname;/*返回密码*/publicStringgetPassword()returnpassword;/*设定用户名*paramname*/publicvoidsetName(Stringname

7、)=name;/*设定密码*parampassword*/publicvoidsetPassword(Stringpassword)this.password=password;2 所示。登录页面login.html非常容易编写,代码实现如示例示例2<html><head><title>用户登录</title><scriptlanguage="JavaScript">functionloginSubmit()if(form1.loginName.value=null|form1.loginName

8、.value=""儿alert("请填写用户名!");returnfalse;if(form1.password.value=null|form1.password.value=""儿alert("请填写密码!");returnfalse;returntrue;</script></head><body><formmethod="POST"name="form1"action="login.jsp">用户名:

9、<inputtype="text"name="loginName"size="20">密&nbsp;码:<inputtype="password"name="password"size="20"><palign=left><inputtype="submit"value整录"name="submit"onclick="returnloginSubmit();"

10、;><inputtype="reset"value="重置"name="reset"></p></form></body></html>要在登录处理页面中进行一系列的逻辑处理:首先查询数据库判断该用户是否已注册,接着在session中保存已登录用户的信息,代码实现如示例3所示。示例3<%pagelanguage="java"contentType="text/html;charset=GBK"%><%pageim

11、port="java.sql.*"%><%pageimport="s2.java.web.sg1.ConnectionManager"%><%pageimport="s2.java.web.sg1.entity.User"%><%request.setCharacterEncoding("GBK");Stringpass=request.getParameter("password");Stringname=request.getParameter("

12、;loginName");Connectioncon=null;PreparedStatementpStatement=null;trycon=ConnectionManager.getConnection();Stringsql="select*fromuserinfowhereloginname=?andpassword=?"pStatement=con.prepareStatement(sql);pStatement.setString(1,name);pStatement.setString(2,pass);ResultSetrs=pStatement.e

13、xecuteQuery();if(rs.next()/如果是已注册用户/把用户名、密码封装在User对象中UserloginedUser=newUser(name,pass);/在session中存放用户登录信息session.setAttribute("LOGINED_USER",loginedUser);/进入新闻发布系统的首页面response.sendRedirect("index.jsp");elseresponse.sendRedirect("login.html");catch(Exceptione)out.printl

14、n("发生错误!错误原因:"+e.getMessage();finallyConnectionManager.closeStatement(pStatement);ConnectionManager.closeConnection(con);%>在新闻发布系统首页面中加入登录验证。此时要完成的任务是:从session中提取用户的信息,如果用户信息存在,显示首页内容;如果用户信息不存在,跳转到登录页面。已经完成了图1.1所示的访问控制流程。但是如果此时用户直接在浏览器地址栏中输入新闻发布系统首页面的地址,还是能够不受登录限制而访问成功的。接下来要完成的就是图1.2所示的

15、访问控制流程。具体代码实现如示例4所示。示例4<%pagelanguage="java"contentType="text/html;charset=GBK"%><%pageimport="s2.java.web.sg1.entity.User"%><html><head><title>新闻发布系统</title></head><%/如果session中不存在该用户的登录信息,转入登录页面Useruser=(User)session.getAtt

16、ribute("LOGINED_USER");if(user=null)response.sendRedirect("login.html");%><FRAMESETrows="20%,80%"cols="*"><FRAMEsrc="top.jsp"name="topFrame"scrolling="NO"marginwidth="0"marginheight="0"><FRAME

17、SETrows="*"cols="25%,75%”><FRAMEsrc="left.jsp"name="leftFrame"scrolling="yes"marginwidth="0"marginheight="0"><FRAMEsrc="welcome.jsp"name="mainFrame"scrolling="yes"marginwidth="0"margi

18、nheight="0"></FRAMESET></FRAMESET><noframes></noframes></html>至此为止,新闻发布系统的访问控制已经基本实现了。还需要验证一下访问控制的效果,具体步骤可分为如下几步。(1)直接在浏览器地址栏中输入URL,访问系统首页面。(2)通过登录页面进入系统首页面。(3)重新开启一个浏览器窗口,直接访问系统首页面。按照上述步骤运行一下,看看每个步骤会发生什么样的结果,并思考一下为什么会产生这样的结果。现在,来分析一下。如果直接在浏览器地址栏中输入URL,访问系统

19、首页面,那么系统会跳入登录页面,提示用户进行登录。这个原因很简单,因为在系统首页面中加入了登录验证。如果通过登录页面进入系统首页面,那么只要是已注册用户,都可以正常进入。这个可以通过登录处理页面的代码(示例3)得到解释。7 / 19那么不管你在其他窗口中是否如果重新开启一个浏览器窗口,直接访问系统首页面,登录,你进入的肯定是登录页面。这是因为:每个session对象都与浏览器一一对应,也就是说,重新开启一个浏览器窗口,相当于重新创建一个session对象,在其他浏览器窗口保存的登录信息与新的浏览器窗口完全无关,所以系统会判定尚未登录,必定跳转进入登录页面。1.1.5 include指令在新闻发

20、布系统中,除了首页面,还有许多二级页面,同样要求只有登录用户才能够访问。那么现在就有一个问题需要解决,看下面的问题:如果要为多个页面添加登录验证,有没有办法避免重复代码的出现?JSP为提供了文件引用指令include。可以将一些共性的内容写入一个单独的文件中,然后通过include指令引用该文件,从而缓解代码的冗余问题,并且修改起来也更加方便,即对这些共性内容只需要修改那个独立的文件即可。首先,需要创建登录验证文件checklogin.jsp,代码实现如示例5所示。示例51.1.6 pageimport="s2.java.web.sg1.entity.User"%>&

21、lt;%Useruser=(User)session.getAttribute("LOGINED_USER");if(user=null)response.sendRedirect("login.html");%>示例5的代码与示例4中进行登录验证的那部分代码一模一样。有了这个独立的文件,只需在系统首页面和其他二级页面中引用该文件就可以了,代码实现如示例6所示。示例6<%pagelanguage="java"contentType="text/html;charset=GBK"%><%pag

22、eimport="s2.java.web.sg1.entity.User"%><html><head><title>新闻发布系统</title></head><%includefile="checklogin.jsp"%><FRAMESETrows="20%,80%"cols="*"><FRAMEsrc="top.jsp"name="topFrame"scrolling="

23、;NO"marginwidth="0"marginheight="0"><FRAMESETrows="*"cols="25%,75%”><FRAMEsrc="left.jsp"name="leftFrame"scrolling="yes"marginwidth="0"marginheight="0"><FRAMEsrc="welcome.jsp"name=&qu

24、ot;mainFrame"scrolling="yes"marginwidth="0"marginheight="0"></FRAMESET></FRAMESET><noframes></noframes></html>1.2已访问人数统计17 / 191.2.1为新闻发布系统增加已访问人数统计功能升级新闻发布系统,增加已访问人数统计功能,具体要求如下。左导航页面中增加一个超链接巳访问人数统计”,单击该超链接后,进入已访问人数统计页面,该页面显示已访问人数,以

25、及访问者的登录名称,如图1.5所示。图1.5已访问人数统计页面为了实现这一功能,需要完成以下工作。(1)创建登录页面(login2.html)。(2)创建登录处理页面(login2.jsp),把已登录用户的信息保存在一个全局范围内(3)在左导航页面(left.jsp)中加入超链接,链接至已访问人数统计页面。(4)创建已访问人数统计页面(showAllLoginedUsers.jsp),把已登录用户的信息从全局范围内取出来。下面,就逐步完成这项升级任务。首先,创建登录页面login2.html,这个登录页面与示例2中的login.html非常相似,只需把form表单的提交地点改为login2.j

26、sp就可以了。接着,进入一个关键的环节,创建登录处理页面login2.jspo代码实现如示例7所示。示例7<%pagelanguage="java"contentType="text/html;charset=GBK"%><%pageimport="java.sql.*"%><%pageimport="java.util.*"%><%pageimport="s2.java.web.sg1.ConnectionManager"%><%pagei

27、mport="s2.java.web.sg1.entity.User"%><%request.setCharacterEncoding("GBK");Stringpass=request.getParameter("password");Stringname=request.getParameter("loginName");Connectioncon=null;PreparedStatementpStatement=null;trycon=ConnectionManager.getConnection

28、();Stringsql="select*fromuserinfowhereloginname=?andpassword=?"pStatement=con.prepareStatement(sql);pStatement.setString(1,name);pStatement.setString(2,pass);ResultSetrs=pStatement.executeQuery();if(rs.next()/如果是已注册用户Userlogineduser=newUser(name,pass);session.setAttribute("LOGINED_USE

29、R",logineduser);ListloginedUsers=newArrayList();/访问者歹U表从全局范围内取出原有的访问者列表if(application.getAttribute("LOGINED_USER")!=null)loginedUsers=(List)application.getAttribute("LOGINED_USER");把新登录用户的信息存入访问者列表中loginedUsers.add(logineduser);/在全局范围内存入访问者列表application.setAttribute("LO

30、GINED_USER",loginedUsers);response.sendRedirect("index.jsp");elseresponse.sendRedirect("login2.html");catch(Exceptione)out.println("发生错误!错误原因:"+e.getMessage();finallyConnectionManager.closeStatement(pStatement);ConnectionManager.closeConnection(con);%>示例7同样实现了访问

31、控制功能,除此之外,示例7的粗体部分则是为了实现已访问人数统计的功能,这段代码的主要用途是把已登录用户的信息存入一个集合中,该集合在全局范围内有效。其中使用到了一个JSP内置对象application,它类似于系统的全局变量,用于实现用户之间的数据共享。稍后将详细介绍这个内置对象,此处了解其基本用途就可以了。接下来的工作较为简单,就是在左导航页面(left.jsp)中加入超链接,链接至已访问人数统计页面,代码实现如示例8所示。示例8<%pagelanguage="java"contentType="text/html;charset=GBK"%&g

32、t;<HTML><HEAD><linkhref="./CSS/style-1.css"rel="stylesheet"type="text/css"></HEAD><BODYBGCOLOR="#E8EDEE"><br><br><h3class="text-1">新闻发布后台管理</h3>< pclass="text-1">< ahref="c

33、reateLevelOneTitle.jsp"target="mainFrame">一级标题发布</a><br>< ahref="createLevelTwoTitle.jsp"target="mainFrame">二级标题及文件位置发布</a><br><br><ahref="showAllLoginedUsers.jsp"target="mainFrame”>已访问人数统计</a></p

34、></BODY></HTML>最后,要创建已访问人数统计页面(showAllLoginedUsers.jsp),把已登录用户的信息从全局范围内取出来,并逐行显示,页面效果如图1.5所示。代码实现如示例9所示。示例9<%pagelanguage="java"pageEncoding="GBK"%><%pageimport="s2.java.web.sg1.entity.User"%><%pageimport="java.util.*"%><htm

35、l><%ListloginedUsers=newArrayList();访问者歹U表/从全局范围内取出访问者列表if(application.getAttribute("LOGINED_USER")!=null)loginedUsers=(List)application.getAttribute("LOGINED_USER");%><body><palign="center"><br><br><br>目前,有<%=loginedUsers.size(

36、)%>人已经访问过本网站!<br><br>访问者的登录名称分别是:<br><%for(inti=0;i<loginedUsers.size();i+)Userlogineduser=(User)loginedUsers.get(i);out.print(logineduser.getName();out.print("<br/>");%></p></body></html>至此为止,新闻发布系统的已访问人数统计功能已经完整实现了。还需要验证一下已访问人数统计的效果,具

37、体步骤可分为如下几步。(1)通过登录页面进入系统首页面,查看已访问人数统计。(2)重新开启一个浏览器窗口,使用不同的用户登录进入首页面,查看已访问人数统计。按照上述步骤运行一下,看看每个步骤会发生什么样的结果,并思考一下为什么会产生这样的结果现在,来分析一下。如果用户通过登录页面进入系统,那么登录处理页面会将该用户信息存放入访问者列表中,此时已访问人数一定会在原有基础上自动加1,并在页面上显示出该用户的信息。如果重新开启一个浏览器窗口,使用不同的用户登录进入首页面,那么已访问人数依然会在原有基础上自动加1,并在页面上显示出这个用户的信息。这是因为:所有的已访问用户的信息都存放在全局范围内,与浏

38、览器窗口无关,这一点一定要同session区分开来。1.2.2JSP内置对象application前面已经提到过,application是一个JSP的内置对象,它类似于系统的全局变量,用于实现用户之间的数据共享。application对象的常用方法如下所示。?voidsetAttribute(Stringkey,Objectvalue):以键/值的方式,将一个对象的值存放到application中。例如,application.setAttribute("LOGINED_USER",newArrayList();就是把一个ArrayList对象存放到application中

39、去,它对应的键是LOGINED_USER。?ObjectgetAttribute(Stringkey):根据键去获取application中存放对象的值。例如,如下代码段就是通过名称为LOGINED_USER的键获取application中存放的对象的值。if(application.getAttribute("LOGINED_USER")!=null)ListloginedUsers=(List)application.getAttribute("LOGINED_USER");至此,JSP的几个常用的内置对象都已经介绍给了。下面通过表1.2对这些内置对

40、象进行一下简要的总结。表1.2JSP的常用内置对象内置对象名称说明out对象用于向客户端输出数据request对象主要用于客户端的请求处理response对象用于响应客户请求并向客户端输出信息session 对象用来存储有关用户会话的所有信息application 对象类似于系统的全局变量,用于实现用户之间的数据共享,1.3 一分级浏览)新闻发布系统的分级浏览属于新闻发布系统的前端页面, 闻。接下来,就一起实现新闻的分级浏览功能。提供给一般用户浏览各级新1.3.1创建前台首页面新闻分级浏览功能的页面效果如图1.6所示,具体要求如下图1.6新闻发布系统的分级浏览?在新闻发布系统的前台首页面上,显

41、示所有新闻一级标题。?为所有新闻一级标题设置超链接,单击后,显示下属的所有新闻二级标题。具体做法可以分解为如下几个步骤。(1)使用表格把前台首页面分为三块:上栏、左下栏、右下栏。(2)上栏显示图片。(3)左下栏显示新闻一级标题,提取到一个单独的文件showFirstTitle.jsp中。(4)右下栏显示新闻二级标题,提取到一个单独的文件showSecondTitle.jsp中(5)使用include指令引入这两个文件。前台首页面(newspre.jsp)的代码实现如示例10所示。示例10<%pagelanguage="java"contentType="te

42、xt/html;charset=GBK"%><html><head><title>新闻发布系统</title></head><body><tablewidth="100%”><tr><tdbgcolor="#FFFFFF"height="86"><imgsrc="./images/head.gif"border="0"width="100%"alt=&quo

43、t;"/></td></tr></table><tablewidth="100%"bgcolor="#FFFFFF"><tr><tdwidth="150"valign="top"align="left"bgcolor="#9999FF”><%includefile="showFirstTitle.jsp"%></td><tdvalign="

44、top"height="100%"width="859"><%includefile="showSecondTitle.jsp"%></td></tr></table></body></html>1.3.2 完成新闻发布系统的一级新闻浏览功能下面要完成的就是新闻一级标题的浏览功能。除了逐条逐行显示新闻一级标题以外,还要为新闻一级标题设置超链接,并在超链接中传递参数:新闻一级标题的ID,以便单击后能够根据新闻一级标题ID显示下属的所有新闻二级标题。创

45、建新闻一级标题的浏览页面(showFirstTitle.jsp),代码实现如示例11所示。示例11<%pagelanguage="java"contentType="text/html;charset=GBK"%><%pageimport="s2.java.web.sg1.*"%><%pageimport="java.util.List"%><table><tr><tdwidth="145"height="90"

46、;valign="top"align="left"><imgsrc="images/left.jpg"border="0"width="146"height="96"alt=""/></td></tr><tr><tdheight="461"width="145"valign="top"><divalign="cent

47、er"><fontsize="4">新闻分类</font></div><br><%/从数据库中获取所有新闻一级标题,并逐行显示FirstLeveTitleDbOpreationfirst=newFirstLeveTitleDbOpreation();Listlistl=first.getAllFirstLevelTitleList();if(list1!=null&&list1.size()!=0)for(inti=0;i<list1.size();i+)FirstLevelTitl

48、efTitle=(FirstLevelTitle)list1.get(i);%><divalign="center"><ahref="newspre.jsp?parentId=<%=fTitle.getId()%>”><%=fTitle.getTitleName()%></a></div><br><%></td></tr></table>1.3.3 完成新闻发布系统的二级新闻浏览功能在完成新闻二级标题的浏览功能之前,首先要在类S

49、econdLevelTitleDbOpreation中添ID获取下属的新闻二级标题,加方法getSecondByFirst(),用来根据新闻一级标题的代码实现如示例12所示。示例12packages2.java.web.sg15;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.uti

50、l.Date;importjava.util.List;publicclassSecondLevelTitleDbOpreation/* 根据新闻一级标题获取下属所有的新闻二级标题* paramint新闻一级标题的ID* returnArrayList新闻二级标题的集合* /publicListgetSecondByFirst(intparentTitleId)Listlist=newArrayList();ConnectiondbConnection=null;PreparedStatementpStatement=null;ResultSetres=null;trydbConnection=ConnectionManager.getConnection();StringstrSql="select*fromSecondLevelTitle"+"whereParentTitle=(?)orderbyCreateTimedesc"pStatement=dbConnection.prepareStatement(strSql);pStatement.setInt(1,parentTitleId);res=pStatement.executeQuery();while(res.next()SecondLevelTitlesTitle=n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论