在本篇中,我们来使用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. BZOJ AC300题留念

  2. BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛( dp )

    树形dp..水 ------------------------------------------------------------------------ #include<cstdio& ...

  3. if简单的写法之范围

    /* Name:if的范围 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月9日 03:22:32 Description: */ # include & ...

  4. 模拟红外协议C程序——接收模块

    目的:方便程序的调试,提供效率,减少工作累,可以不在线调试编程时显示实时数据,特别产品不带显示的或者MCU是OPT的,有很大的帮助. 过程:将要看的数据发送出来,另一个板(一个带有显示的就OK了,显示 ...

  5. Eclipse中JBOSS5.1无法启动的问题解决办法

    今天在Eclipse中启动JBoss 5.1时遇到这样的一个错误: …… ERROR [AbstractKernelController] Error installing to Instantiat ...

  6. stm32之CAN发送、接收详解

    CAN接收报文并过滤之标识符过滤:(重点.难点) 在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的.因此,发送者以广播的形式把报文发送给所有的接收者.节点在接收报文时-根据标识符的 ...

  7. android软键盘弹出隐藏的监听

    通过网上搜索关于软键盘的隐藏弹出的监听,有几种方式,其中最有效的方式是在View的Onlayout()里面做文章 具体代码: 将布局视图自定义,重写onlayout()方法,然后在主Activity里 ...

  8. BZOJ 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜( 差分约束 )

    枚举每头牛, 假设它在说谎, 建图判圈就行了...为啥水题都没人来写.. --------------------------------------------------------------- ...

  9. Agg vs. Cairo 二维绘图引擎之比较和选择 .

    Agg vs. Cairo 二维绘图引擎之比较和选择 cheungmine 当今时代对于作为二维图形软件开发者, 是幸运的.因为除了Windows GDI/GDI+之外,我们还有很多其他的选择.而且这 ...

  10. Android自己定义控件(状态提示图表)

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操 ...