在本篇中,我们来使用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. python学习(一)

    1 python一切皆为对象,因为现实 包含了一系列的数据和操作这些数据的方法的一个整体,就叫作对象. 自行车 属性:手刹车,轮胎,脚踏板方法:如何前进的方法,控制停止的方法,控制方向 实际内容 男人 ...

  2. eclipse the user operation is waiting for building workspace" to complete

    "the user operation is waiting for building workspace" to complete", 解决办法: 1.选择菜单栏的“P ...

  3. 关于jsonp(~~原理和理解)

    JSON和JSONP 与XML相比,JSON是一个轻量级的数据交换格式.JSON对于JavaScript开发人员充满魅力的原因在于JSON本身就是Javascript中的对象. 例如一个ticker对 ...

  4. android如何让service不被杀死-提高进程优先级

    1.在service中重写下面的方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动重写创建 @Override public int onStartCommand ...

  5. Linux下VNC的安装和开机启动

    1.确认VNC是否安装默认情况下,Red Hat Enterprise Linux安装程序会将VNC服务安装在系统上.确认是否已经安装VNC服务及查看安装的VNC版本[root@testdb ~]# ...

  6. [置顶] HMM Tutorial 隐马尔科夫模型

    有一个月没有写博客了,这一个月系统的学习了HMM model.  上周周五做了个report 感觉还好.  所以把Slide贴上来.

  7. js中exec、test、match、search、replace、split、indesOf()用法

    exec:对string进行正则处理,并返回匹配结果.array[0]为原字符串,array[i]为匹配在整个被搜索字符串中的位置. test:测试string是否包含有匹配结果,包含返回true,不 ...

  8. (诊断)为GitHub添加SSH key时出现“Could not open a connection to your authentication agent”错误的应对方案(转)

    在为windows 环境下的github账户添加SSH key时,需要在Git Bash执行如下命令: 第一步:检查已有的SSH keys $ ls -al ~/.ssh 第二步:生成新的SSH ke ...

  9. 怎样在android实现uc和墨迹天气那样的左右拖动效果

    import android.app.Activity; import android.os.Bundle; import android.content.Context; import androi ...

  10. Android应用开发经常使用知识

    在其它站点看到的,Mark一下 1.近期打开的应用不在近期任务列表中显示 android:excludeFromRecents="true" 设置为true,则排除在近期任务列表之 ...