在本篇中,我们来使用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. Activity中Menu相关的几个方法的调用时机

    用于创建菜单的常用的方法有如下两种: 1.onCreateOptionsMenu(Menu menu) 2.onPrepareOptionsMenu(Menu menu) MyDiaryActivit ...

  2. pkg_utility

    创建包名: CREATE OR REPLACE PACKAGE BODY PKG_UTILITY AS --字符串转换到索引表 PROCEDURE STR_TO_LIST(PI_STR IN VARC ...

  3. [转] 解析LayoutSubviews

    转自: http://www.cnblogs.com/YouXianMing/p/3897543.html 从百度上搜索了一下layoutSubviews的用处,以下是搜索的结果,当然,笔者是会一一验 ...

  4. php利用iframe实现无刷新文件上传功能

    上传原理很简单就是利用表单的打开方式为iframe的name名,这样就可以在当前页面的iframe打来了,实现文件上传,再利用js返回上传结果. form target .在 action 属性中规定 ...

  5. linux chmod权限

    Linux chmod 命令 chmod用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限.该命令有两种用法.一种是包含 字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. 1 ...

  6. (step7.2.4)hdu 2674(N!Again——简单数论)

    题目大意:输入一个整数n,输出N! mod 2009 的结果. 解题思路: 1)任意数  n = ( n / 2009) * 2009 + n % 2009 2)40!  mod 2009  等于 2 ...

  7. sequence2(高精度dp)

    sequence2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  8. 删除: warning C4996: &#39;sprintf&#39;: This function or variable may be unsafe. Consider 方法

    可以使用的最简单的方法: 选项Project   |   Configuration   Properties   |   C/C++   |   Preprocessor   |   Preproc ...

  9. BZOJ 2427: [HAOI2010]软件安装( dp )

    软件构成了一些树和一些环, 对于环我们要不不选, 要么选整个环. 跑tarjan缩点后, 新建个root, 往每个入度为0的点(强连通分量) 连边, 然后跑树dp( 01背包 ) ---------- ...

  10. QList 和std::list的比较

    QList QList<T> 是一个Qt通用容器类.它存储一序列的值,并且提供基于索引的数据访问方法和快速的插入和删除操作. QList<T>, QLinkedList< ...