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开发来说,一个会话就是用户通过浏览器与服务器之间进行的一次通话,它包含浏览器与服务器之间的多次请求、响应过程。如图1.3所示描述了浏览器与服务器的一次会话过程。当用户向服务器发出第一次请求时,服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束(浏览器关闭,本次会话结束)。2/19session对象浏览器浏览器session对象请求11请求2…n响应11响应2…n图1.3一次会话过程JSP提供了一个可以在多个请求之间持续有效的会话对象session,session对象允许用户存储和提取会话状态的信息。接下来,就来学习JSP内置对象session。1.1.3JSP内置对象session在JSP中,提供了一个内置对象session,session对象用来存储有关用户会话的所有信息。session对象的常用方法如下:voidsetAttribute(Stringkey,Objectvalue):以键/值的方式,将一个对象的值存放到session中去。例如:session.setAttribute(name,admin);就是把字符串admin存放到session中去,它对应的键是name。ObjectgetAttribute(Stringkey):根据键去获取session中存放的对象的值。例如:Stringname=(String)session.getAttribute(name);就是通过名称为name的键获取session中存放的对象的值。在JSP中,访问控制就是基于session对象来完成的,接下来,就使用JSP内置对象session为新闻发布系统增加访问控制。1.1.4为新闻发布系统增加访问控制现在升级新闻发布系统,增加访问控制功能,要求系统提供用户登录页面,所有用户必须登录之后,才能访问新闻发布系统。访问控制流程如图1.4所示。3/19登录处理页面(login.jsp)1.获得登录信息2.查询数据库,判断该用户是否注册3.如果该用户已注册,在session中保存该用户的登录信息,并且跳转到新闻发布系统的首页面新闻发布系统首页面(index.jsp)1.从session中提取该用户信息2.如果用户信息存在,显示首页内容3.如果用户信息不存在,跳转到登录页面132用户已注册session中无法提取到用户信息图1.4新闻发布系统的访问控制流程根据新闻发布系统的访问控制流程,至少要完成如下几个步骤。(1)在news数据库中创建表userinfo,负责存储用户名、密码。(2)创建类(User.java),负责存储登录用户的信息,如用户名、密码。(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;publicclassUser{privateStringname;//用户名privateStringpassword;//密码4/19/***构造函数**@paramname用户名*@parampassword密码*/publicUser(Stringname,Stringpassword){this.name=name;this.password=password;}/***返回用户名*/publicStringgetName(){returnname;}/***返回密码*/publicStringgetPassword(){returnpassword;}/***设定用户名*@paramname*/publicvoidsetName(Stringname){this.name=name;}/***设定密码*@parampassword*/publicvoidsetPassword(Stringpassword){this.password=password;}}登录页面login.html非常容易编写,代码实现如示例2所示。5/19示例2htmlheadtitle用户登录/titlescriptlanguage=JavaScriptfunctionloginSubmit(){if(form1.loginName.value==null||form1.loginName.value==){alert(请填写用户名!);returnfalse;}if(form1.password.value==null||form1.password.value==){alert(请填写密码!);returnfalse;}returntrue;}/script/headbodyformmethod=POSTname=form1action=login.jsp用户名:inputtype=textname=loginNamesize=20密 码:inputtype=passwordname=passwordsize=20palign=leftinputtype=submitvalue=登录name=submitonclick=returnloginSubmit();inputtype=resetvalue=重置name=reset/p/form/body/html要在登录处理页面中进行一系列的逻辑处理:首先查询数据库判断该用户是否已注册,接着在session中保存已登录用户的信息,代码实现如示例3所示。示例3%@pagelanguage=javacontentType=text/html;charset=GBK%%@pageimport=java.sql.*%%@pageimport=s2.java.web.sg1.ConnectionManager%%@pageimport=s2.java.web.sg1.entity.User%6/19%request.setCharacterEncoding(GBK);Stringpass=request.getParameter(password);Stringname=request.getParameter(loginName);Connectioncon=null;PreparedStatementpStatement=null;try{con=ConnectionManager.getConnection();Stringsql=select*fromuserinfowhereloginname=?andpassword=?;pStatement=con.prepareStatement(sql);pStatement.setString(1,name);pStatement.setString(2,pass);ResultSetrs=pStatement.executeQuery();if(rs.next()){//如果是已注册用户//把用户名、密码封装在User对象中UserloginedUser=newUser(name,pass);//在session中存放用户登录信息session.setAttribute(LOGINED_USER,loginedUser);//进入新闻发布系统的首页面response.sendRedirect(index.jsp);}else{response.sendRedirect(login.html);}}catch(Exceptione){out.println(发生错误!错误原因:+e.getMessage());}finally{ConnectionManager.closeStatement(pStatement);ConnectionManager.closeConnection(con);}%在新闻发布系统首页面中加入登录验证。此时要完成的任务是:从session中提取用户的信息,如果用户信息存在,显示首页内容;如果用户信息不存在,跳转到登录页面。已经完成了图1.1所示的访问控制流程。但是如果此时用户直接在浏览器地址栏中输入新闻发布系统首页面的地址,还是能够不受登录限制而访问成功的。接下来要完成的就是图1.2所示的访问控制流程。具体代码实现如示例4所示。7/19示例4%@pagelanguage=javacontentType=text/html;charset=GBK%%@pageimport=s2.java.web.sg1.entity.User%htmlheadtitle新闻发布系统/title/head%//如果session中不存在该用户的登录信息,转入登录页面Useruser=(User)session.getAttribute(LOGINED_USER);if(user==null){response.sendRedirect(login.html);}%FRAMESETrows=20%,80%cols=*FRAMEsrc=top.jspname=topFramescrolling=NOmarginwidth=0marginheight=0FRAMESETrows=*cols=25%,75%FRAMEsrc=left.jspname=leftFramescrolling=yesmarginwidth=0marginheight=0FRAMEsrc=welcome.jspname=mainFramescrolling=yesmarginwidth=0marginheight=0/FRAMESET/FRAMESETnoframes/noframes/html至此为止,新闻发布系统的访问控制已经基本实现了。还需要验证一下访问控制的效果,具体步骤可分为如下几步。(1)直接在浏览器地址栏中输入URL,访问系统首页面。(2)通过登录页面进入系统首页面。(3)重新开启一个浏览器窗口,直接访问系统首页面。按照上述步骤运行一下,看看每个步骤会发生什么样的结果,并思考一下为什么会产生这样的结果。现在,来分析一下。如果直接在浏览器地址栏中输入URL,访问系统首页面,那么系统会跳入登录页面,提示用户进行登录。这个原因很简单,因为在系统首页面中加入了登录验证。如果通过登录页面进入系统首页面,那么只要是已注册用户,都可以正常进入。这个可以通过登录处理页面的代码(示例3)得到解释。8/19如果重新开启一个浏览器窗口,直接访问系统首页面,那么不管你在其他窗口中是否登录,你进入的肯定是登录页面。这是因为:每个session对象都与浏览器一一对应,也就是说,重新开启一个浏览器