在本篇中,我们来使用Session完成一个用户登录的案例,前提声明:这个案例主要用于学习Session技术,是属于比较简单的类型,以后会采用MVC模式来开发登录,那就会比较复杂。

  现在大多数网站都提供登录功能,而我们之所以登录要使用到Session,在于当一个网站不同的页面里面都需要判断用户是否已经登录才能显示某些具有网站会员权限的功能,所以使用Session对象来保存用户登录标志最合适不过,同时,当用户注销登录时,也需要将Session中的用户标志移除,这样用户在继续访问网站或该网站其他页面时才能看到用户状态不再是已经登录状态。

  另外注意,如果我们不用URL重写的话,请确保浏览器没有禁用Cookie;而如果我们不想去理会浏览器是否禁用Cookie,请对该web工程中涉及的超链接URL或转发URL进行URL重写(并在最开始的部分进行getSession()获取首次Session)。

  现在开始进行使用Session进行用户登录的开发:

  我们先要建立用户的JavaBean对象,在dao包中创建User对象,注意这里要采用“public”权限,这是因为在之后JSP页面中需要使用到User对象。

 public class User {
private String userName;
private String password;
。。。//这里get和set方法及构造器方法均省略
}

接着我们需要建立数据库,我们还是在database包中建立UserDatabase类来模拟数据库(还是因为数据库没学T_T!),同时在数据库中模拟建立已经注册的用户:

 public class UserDatabase {
private static Map<String,User> map = new HashMap<String, User>(); static {
map.put("userId1", new User("aaa","123"));
map.put("userId2", new User("bbb","1234"));
map.put("userId3", new User("ccc","12345"));
} public static Map<String,User> getAllUser() {
return map ;
} }

现在我们可以创建用户登录的界面了,这里采用HTML(JSP还没学嘛,怎么这么多要学T_T):

    用户登录 <br><br>
<form action="/LoginProject/servlet/LoginHandler" method="post">
用户名: <input type="text" name="user"> <br/>
密码 : <input type="password" name="password"> <br/>
<input type="submit" value="提交">
</form>

  从表单提交的路径可以看出,我们所做的处理登录的Servlet名为LoginHandler,在这个Servlet中我们要对从表单提交的用户名和密码与数据库中进行验证,如果验证成功,则创建(或获取)Session,将这个Session中保存这个用户的标记,用于表示所有资源可以先对Session中这个标记进行判断用户是否登录,再进行对应功能的显示。最后登录成功的话我们就跳转到到某个页面:

       //获取表单的用户名和密码
String username = request.getParameter("user");
String password = request.getParameter("password"); Map<String,User> map = UserDatabase.getAllUser(); for(Map.Entry<String, User> entry : map.entrySet()) {
User u = entry.getValue();
if(u.getUserName().equals(username) && u.getPassword().equals(password)){
//用户名和密码均匹配,登录成功
request.getSession().setAttribute("user", u); //登录成功后跳转到首页
response.sendRedirect("/LoginProject/index.jsp"); return;
}
} //如果用户名或密码匹配失败,则登录失败
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("登录失败");

  从上面代码中可以看到,如果我们登录成功的话,就跳转到index.jsp,在这个页面中我们需要简单使用JSP, 为了用户的体验效果,我们可以调用Session来将用户显示出来,同时加入“注销”超链接:

     <body>
&quot;您好 ,欢迎您:
<%
User user = (User) session.getAttribute("user");
if(user!=null)
out.write(user.getUserName());
%>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href="/LoginProject/servlet/LogoutHandler">注销</a>
<br>
 </body>

  在这段JSP中使用到了最开始我们对定义用户User的Javabean对象(这就是为什么要将User类进行public权限定义)。

  注意:如果在这个页面中User出现了“User cannot be resolved to a type”的错误,那么就是JSP无法默认帮我们导入User所在的包,那么我们就必须在该JSP中手动导入:<%@ page import="fjdingsd.dao.User" %>,导入的位置在可以在<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>这个之后:

  

  到此,如果我们输入正确的用户名和密码,则能正确登录,并在页面上看到显示的用户名,如果我们想退出登录状态,点击“注销”这个超链接,将会交给LogoutHandler这个Servlet处理。

  在LogoutHandler这个Servlet中要处理的是将Session中保存用户的标识给剔除,这样其他页面在判断用户是否登录中就知道用户已经退出登录。同时我们可以在这个代码中再次(可以用作验证)判断Session的标识是否剔除,然后在服务器上显示用户下线。最后再回到开始的登录页面:

    HttpSession session = request.getSession(false);
  User user = (User)session.getAttribute("user");
  if(user != null) {
 session.removeAttribute("user");
  }   if(session.getAttribute("user")==null) {
System.out.println("用户: "+user.getUserName()+" 已经下线!");
}
response.sendRedirect("/LoginProject/login.html");

  这就是整个简单的登录流程。

  我们来看看效果,首先是登录页面:

  

正确登录进去,可以看到登录的用户,这个用户对象的获取是在JSP中从Session中获取的:

  

当我们点击注销后,看服务器的控制台,会看到确实已经将Session中用户的标识给清除了,Session中再也没有“user”这个属性:

  

  Session中已经没有“user”这个属性了,也代表着用户已经注销登录,同时页面也重新回到了登录页面,等待下次用户的登录,等待着Session中重新为登录的用户定义新的“User”属性标识。

Servlet的学习之Session(4)的更多相关文章

  1. Servlet的学习之Session(3)

    在上一篇<Servlet的学习之Session(2)>我们知道了Session能实现一个会话过程中保存数据或者多个会话中实现同一个Session的关键因素就是Cookie,只是Cookie ...

  2. Servlet的学习之Session(2)

    在上一篇中我们学习了Session对象默认在一个会话过程中,由服务器创建,能保存在这个会话过程中用户访问多个web资源时产生的需要保存的数据,并在访问服务器中其他web资源时可以将这些数据从Sessi ...

  3. Servlet的学习之Session(1)

    在学习完了Servlet中的Cookie技术后,我们再来学习另一个能保存会话数据的技术——Session. Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其 ...

  4. Servlet的学习之Session(5)

    在上一篇中我们介绍了如果使用Session来做一个简单的用户登录案例,在本篇中我们继续使用Session技术来做一个防止表单重复提交的案例. 这是一个很重要的知识点,在很多框架中都有防止表单重复提交的 ...

  5. JavaWeb之Servlet:Cookie 和 Session

    会话 现实生活中我们会用手机跟对方对话,拿起手机,拨号,然后对面接听,跟着互相通话,最后会话结束. 这个过程也可以用我们的B/S模式来描述: 打开浏览器—>输入地址->发出请求->服 ...

  6. Servlet的学习之Cookie

    从本篇开始学习Servlet技术中的Cookie专题. 首先来了解什么是“会话”.会话是web技术中的一个术语,可以简单的理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭 ...

  7. Servlet的学习之Filter过滤器技术(1)

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  8. Servlet的学习(四)

    在本篇的Servlet的学习中,主要来学习由使用MyEclipse来开发Servlet的一些小细节. 细节一:在web.xml中可以对同一个Servlet配置多个对外访问路径,并如果在web.xml中 ...

  9. Servlet的学习之Request请求对象(3)

    本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...

随机推荐

  1. 限制QLineEdit的数值输入范围(一共4种限制器:QDoubleValidator, QIntValidator, QRegExpValidator, 和QRegularExpressionValidator)

    在使用QLineEdit输入数值时,经常遇到限制其范围的需要,比如角太阳高度角范围为[-90,90],经度值范围[-180,180],方位角范围[0,360].Qt提供了QIntValidator和Q ...

  2. 为什么希捷选择了8GB作为标准的闪存容量呢?答案就在下面(新的驱动器可以实现一定程度上的写入缓存)

    与前两代Momentus XT产品不同,希捷称第三代混合硬盘所使用的技术更接近真正的SSHD(Solid State Hybrid Disk?),而不是HHD.也就是说更偏向于固态硬盘.首先它不会属于 ...

  3. FreePascal的VMT与Delphi不一致,没有负方向

    因为不需要与C++兼容嘛:http://www.freepascal.org/docs-html/prog/progsu168.html 如果要想取得它真正的VMT,可以Pointer强行转换+100 ...

  4. Automake创建项目

    autoconf和automake可以方便的构建linux下项目,一个简单的automake项目实例,麻雀虽小五脏俱全,以后无外乎在这基础上扩展相应的宏完善而已. .首先建立项目目录树 )创建目录树 ...

  5. PHP设计模式——策略模式

    概述 策略模式属于对象的行为模式.其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化 UML图 策略模式中主 ...

  6. 斯坦福大学IOS开发课程笔记(第七课第一部分)

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/31462099 作者:小马 这节课的内容太多,分两部分介绍.本节课主要是介绍怎样开发 ...

  7. SAX方式解析XML

    sax解析分为以下几步: 1 获取一个saxparserfactory 2 获取一个解析器 3 创建handler对象,这个myHandler是继承了DefaultHandler的一个类,这个实现类里 ...

  8. python 函数形参四种格式

    1:f(a,b) 2:f(a,b=value)有默认值的参数必须在后面 3:f(*a)多个参数直接传进一个元组 4:f(**a)以keys=values 形式给参数,传入转换为字典 def test( ...

  9. Foundation补充

    1常用结构体: NSRange.NSPoint(CGPoint).NSSize(CGSize).NSRect(CGRect) 2 NSRange: 字符串中有一个方法rangeOfString:str ...

  10. JVM调优总结(二)-一些概念

    Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了.对于非基本类型的Java对象,其大小就值得商榷. 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有 ...