教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

JAVA培训之HttpSession第二例

更新时间:2016年08月26日11时41分 来源:传智播客JAVA培训学院 浏览次数:

通过HttpSession案例分析,我们已经对保存用户信息案例的功能需求有了一定的了解,下面我们就来完成该案例,案例详情请参考HttpSession第二例步骤详解,点击此处 下载案例源代码,具体操作步骤如下所示:
(1)新建一个web应用,Example22,在WebRoot目录下新建一个目录session,并在该目录下新建一个jsp文件,名称为login.jsp,主要代码如例1-1所示:
例1-1 login .jsp
<body>
<form action="/Example22/LoginServlet" method="post">
    用户名:<input type="text" name="username"/><br/>
    密 码:<input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
例1-1中,form表单的提交方式是post,提交的路径:“/Example22/LoginServlet“,其中”/LoginServlet“是Servlet类的访问路径,后面会说明。
(2)在session目录下再新建一个jsp文件,succ1.jsp。
(3)在session目录再新建一个jsp文件,succ2.jsp。
(4)在src目录下新建一个Servlet类,名称为LoginServlet,其访问路径配置为“/LoginServlet”,主要代码如例1-3所示:
例1-3 LoginServlet.java
public class LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       /*
        * 1. 获取表单数据
        */
       // 处理中文问题
       request.setCharacterEncoding("utf-8");
       // 获取
       String username = request.getParameter("username");
       String password = request.getParameter("password");
       /*
        * 2. 校验用户名和密码是否正确
        */
       if(!"itcast".equalsIgnoreCase(username)) {//登录成功
           /*
            * 3. 如果成功
            *   >  保存用户信息到session中
            *   >  重定向到succ1.jsp
            */
           HttpSession session = request.getSession();//获取session
           session.setAttribute("username", username);//向session域中保存用户名
           response.sendRedirect("/Example22/session/succ1.jsp");
       } else {//登录失败
           /*
            * 4. 如果失败
            *   > 保存错误信息到request域中
            *   > 转发到login.jsp
            */
           request.setAttribute("msg", "用户名或密码错误!");
            RequestDispatcher qr=
            request.getRequestDispatcher("/session/login.jsp");//得到转发器
           qr.forward(request, response);//转发
       }
    }
}
例1-3中,首先获得请求参数,因为表单提交的方式是post,所以对于请求参数的乱码问题可以使用request的setCharacterEncoding("utf-8")方法处理乱码。获取的用户名如果是“itcast”就让它登录失败,将错误信息“用户名或密码错误”保存在request域,然后再转发到login.jsp页面。如果不是“itcast”就表示登录成功,将用户名保存在session域中,然后重定向到succ1.jsp页面。
(5)对login.jsp页面做一些补充,具体如例1-4所示:
例1-4 login.jsp
<body>
<%
    String message = "";
    String msg = (String)request.getAttribute("msg");//获取request域中的名为msg的属性
    if(msg != null) {
       message = msg;
    }
%>
<font color="red"><b><%=message %> </b></font>
... ...此处省略例1-1中的代码
</body>
例1-4中,在login.jsp页面中,从request域中取出错误信息,这个时候我们要考虑到一个问题,如果直接将错误信息输出到浏览器端,会有一个问题,当用户直接访问login.jsp页面时,request域中还没有存放msg属性,因此msg的值为空,所以浏览器端会输出null。因此我们要先判断msg是否为空,如果不为空再将它输出到浏览器端。
(6)succ1.jsp页面信息如例1-5所示:
例1-5 succ1.jsp
<body>
<h1>succ1</h1>
<%
String username = (String)session.getAttribute("username");
if(username == null) {
    /*
    1. 向request域中保存错误信息,转发到login.jsp
    */
    request.setAttribute("msg", "您还没有登录!请求先登录!");
    request.getRequestDispatcher("/session/login.jsp").forward(request,
 response);
    return;
}
%>
欢迎欢迎,热烈欢迎,欢迎<%=username %>领导指导工作!
  </body>
例1-5中,首先从session中获取登录的用户名,如果用户名username为空,则表明当前用户没有登录,就直接访问本页面,所以向request域中添加错误信息“您还没有登录!请先登录!”,然后转发到login.jsp页面,如果用户名username不为空就将用户名显示在页面中,如<%username%>。
(7)succ2.jsp和succ1.jsp内容相同,这里就不在叙述了。
(8)将Example22发布到Tomcat服务器,然后启动服务器,在浏览器端访问login.jsp,浏览器显示结果如图1-1所示:

图1-1 登录页面
(9)在图1-1中,输入用户名:itcast,密码123,然后点击“登录”按钮,浏览器显示结果如图1-2所示:

图1-2 登录失败
图1-2中,显示“用户名和登录错误“,说明登录失败,转发到了login.jsp页面。在LoginServlet中,我们设定的逻辑就是如果用户名为itcast,就表示登录失败。
(10)在图1-2中,输入用户名:aaa,密码:123,点击“登录“,浏览器显示结果如图1-3所示:

图1-3 登录成功
由图1-3可知,登录成功后重定向到succ1.jsp,地址栏上的地址改变,并且显示当前用户的名称:aaa。
(11)现在将浏览器窗口关闭,然后重新打开浏览器,在浏览器端访问succ1.jsp,浏览器显示结果如图1-4所示:

图1-4 访问失败
将浏览器关闭,那么之前登录后服务器创建的名为JSESSION的cookie就死亡了,那么对应的session就无法获取,session中保存的用户名也就无法获取。再次打开浏览器,访问succ1.jsp,服务器创建新的session,新的session中并不存在用户名信息,因此转发到login.jsp,然后显示“您还没有登录!请先登录!“。
(12)在图1-4中,输入用户名:aaa,密码:123,然后点击“登录“,这时session中就有了用户信息,succ2.jsp页面与succ1.jsp一样,所以现在访问succ2.jsp可以访问成功,如图1-5所示:

图1-5 访问succ2.jsp
图1-5中,成功的从session中获得用户信息,succ2.jsp访问成功。只要浏览器不关闭,在一定时间内用户的状态都是登录状态,无论访问succ1.jsp还是succ2.jsp都可以。
我们平时上网时,第一次登录某个网站点击了记住用户名,下次再访问该网站时,不用再输入用户名直接输入密码即可。这个是怎么做到的?其实是利用Cookie实现了记住用户名的功能。下面我们就来练习如何使用cookie记住用户名。
(13)用户第一次登录,如果登录成功,将其用户名保存在Cookie中,并且将Cookie的过期时间设置为一天后,然后发送给浏览器。现在我们对LoginServlet进行修改,如下所示:
public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
      ... ... 此处省略获取请求参数
       if(!"itcast".equalsIgnoreCase(username)) {//登录成功
           /*
            * 附加项:把用户名保存到cookie中,发送给客户端浏览器
            * 当再次打开login.jsp时,login.jsp中会读取request中的cookie,把它显示到用户名文本框中
            */
           Cookie cookie = new Cookie("uname", username);//创建Cookie
           cookie.setMaxAge(60*60*24);//设置cookie命长为1天
           response.addCookie(cookie);//保存cookie
       ... ... 此处省略登录成功处理代码
       } else {//登录失败
         ... ... 此处省略例1-3中登录失败处理代码
       }
    }
(14)再修改login.jsp页面,如例1-6所示:
例1-6 login.jsp
<body>
<%
/*
读取名为uname的Cookie!
如果为空显示:""
如果不为空显示:Cookie的值
*/
String uname = "";
Cookie[] cs = request.getCookies();//获取请求中所有的cookie
if(cs != null) {// 如果存在cookie
    for(Cookie c : cs) {//循环遍历所有的cookie
       if("uname".equals(c.getName())) {//查找名为uname的cookie
           uname = c.getValue();//获取这个cookie的值,给uname这个变量
       }
    }
}
%>
... ... 此处省略1-4中代码
<form action="/Example22/LoginServlet" method="post">
    用户名:<input type="text" name="username" value=”<%=uname%>”/><br/>
    密 码:<input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
</form>
 
</body>
例1-6中,首先获得所有Cookie,再遍历所有Cookie,然后查找名字为uname的cookie,如果找到,将该Cookie的值赋值给uname变量,然后将uname变量的值赋给名字为username的表单项的value属性。
(15)重新启动服务器,在浏览器端访问login.jsp,输入用户名:zhangsan,密码:123,然后点击“登录“按钮,如图1-6所示:

图1-6 登录
(16)登录成功后,将浏览器关闭,再打开浏览器,再次访问login.jsp,如图1-7所示:

图1-7 记住用户名
如图1-7所示,用户名zhagnsan回显在登录页面中,这就是记住用户名的实现原理。当时间超过一天,名字为uname的Cookie就会被浏览器杀死,这个时候在访问登录页面,就不会回显用户名。

本文版权归传智播客Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Java培训学院
首发:http://www.itcast.cn/javaee