用户登入案例:

按一般的网站登入实例,用户在页面登入页输入账号、密码,验证通过后,在首页显示其“欢迎回来,xxx”.

首先完成登入页login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登入</title>
</head>
<body>
<form action="/CookieSession/LoginServlet" method="post">
<p>账号:<input type="text" name="userName"/></p>
<p>密码:<input type="password" name="password"/></p>
<p><input type="submit" value="登入"/> </form>
</body>
</html>

 然后再是登入失败的页面,加上失败后返回首页的链接

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登入失败</title>
</head>
<body>
<p>登入失败了,返回<a href="/CookieSession/login.html">登入</a>
</body>
</html>

 接下来就是完成servlet了,首先写一个LoginServlet来验证其正确性,同时若是正确,我们让其跳转到另外的一个indexservlet页面,同时在浏览器显示登入成功的页面,如下

package com.gqx.SessionDemo;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { /**
* 处理登录的逻辑
*/
private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name=request.getParameter("userName");
String password=request.getParameter("password"); if (name.equals("gqxing") && password.equals("123456")) {
//登入成功
/*
* context域对象:不合适,可能会覆盖数据。
* 首先假设用上request域对象,来实现页面的跳转页面数据的共享
*/
request.setAttribute("userName", name); //添加保存共享的数据
request.getRequestDispatcher("/IndexServlet").forward(request, response); //请求的转发 }else {
//登入失败,重定向跳回原页面
response.sendRedirect(request.getContextPath()+"/fail.html");
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }

  在再次就是登入成功的目标servlet

package com.gqx.SessionDemo;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class IndexServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter write=response.getWriter();
//获取属性
String name=(String) request.getAttribute("userName");
String html="<html><body>欢迎回来,"+name+"</body></html>";
write.write(html);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }

  

这个时候我们可以看到登入的效果如图

这就是因为request域对象在这里要实现数据的共享,就要用到请求的转发,request对象和起初的那个loginServlet相关,一旦脱离,域对象里就没有数据了为null,这就要求我们这个网站全部都用到转发技术处理,显然这样是不切实际的。

于是我们就换另一域对象——session来做实验,如下:

package com.gqx.SessionDemo;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class LoginServlet extends HttpServlet { /**
* 处理登录的逻辑
*/
private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name=request.getParameter("userName");
String password=request.getParameter("password"); if (name.equals("gqxing") && password.equals("123456")) {
//登入成功
/*
* context域对象:不合适,可能会覆盖数据。
* 首先假设用上request域对象,来实现页面的跳转页面数据的共享
*/ // request.setAttribute("userName", name); //添加保存共享的数据
// request.getRequestDispatcher("/IndexServlet").forward(request, response); //请求的转发 HttpSession session=request.getSession();
session.setAttribute("userName", name);
//这个时候可以用到重定向技术
System.out.println("验证成功");
response.sendRedirect(request.getContextPath()+"/IndexServlet"); }else {
//登入失败,重定向跳回原页面
response.sendRedirect(request.getContextPath()+"/fail.html");
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }

  

package com.gqx.SessionDemo;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class IndexServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); PrintWriter write=response.getWriter();
//获取属性
// String name=(String) request.getAttribute("userName");
//获取session对象对象
HttpSession session=request.getSession(false);
if (session==null) {
//没有登入成功(第一次访问本页面,或是没有对应的JSESSIONID,),跳到登入页面去
response.sendRedirect(request.getContextPath()+"/login.html");
return ;
}
//取出会话数据
String name=(String) session.getAttribute("userName");
if (name==null) {
//当用户注销的时候,并没有将session删除,只删除了name(有可能其他必要的信息保存在了session中,故不可直接删除),
//这个时候,还需要在返回登入页验证
response.sendRedirect(request.getContextPath()+"/login.html");
return;
}
String html="<html><body>欢迎回来,"+name+"</body></html>";
write.write(html);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }

  这个时候就没有我们前面遇到的问题了,

我们可以在加一个功能,当用户想退出的时候,我们就需要另外设计注销的功能了,我们不能再用session销毁方法了,

session.invalidate();  		//手动销毁

因为,我们在服务器端保存的session对象中有时候不仅仅包含着我们的名字信息,有可能还有其他方面的信息,需要在下次登入的时候读取,我们可以采用移除属性的方法

此时我们可以在indexServlet中添加一个安全退出连接

String html="<html><body>欢迎回来,"+name+",<a href="+request.getContextPath()+"/LogoutServlet>注销登入</a></body></html>";

 在去添加一个LogoutServlet

package com.gqx.SessionDemo;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class LogoutServlet extends HttpServlet { /**
* 移除名字属性,退出逻辑
* 删除掉session对象中指定的userName属性即可!
*/
private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session=request.getSession(false); //、删除session属性
if (session!=null) {
session.removeAttribute("userName");
}
//回到登入页面来
response.sendRedirect(request.getContextPath()+"/login.html");
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }

  效果如图

  

Session案例的更多相关文章

  1. 零基础学习java------29---------网络日志数据session案例,runtime(导出jar程序)

    一. 网络日志数据session案例 部分数据 数据中的字段分别为: 访客ip地址,访客访问时间,访客请求的url及协议,网站响应码,网站返回数据量,访客的referral url,访客的客户端操作系 ...

  2. Session案例:简易的购物车

    三个jsp和两个Servlet组成:在WebContent下边建立一个shoppingcart文件夹,将三个jsp文件放在里面: 1.建立一个step1.jsp文件,出现一个表格,是一个复选框,可以选 ...

  3. 简单的Session案例 —— 一次性验证码

    一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码,其原理与利用Session防止表单重复提交的原理基本一样,只是将表单标识号变成了验证码的形式,并且要求用户将提示的验证码手工填写进一个 ...

  4. [原创]java WEB学习笔记34:Session 案例 之 解决表单重复提交

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. [原创]java WEB学习笔记33:Session 案例 之 购物车

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. Session案例-用户登录场景

    package com.loaderman.demo; import java.io.IOException; import java.io.PrintWriter; import javax.ser ...

  7. session案例之验证码

    一.需求分析 其中,一张图片就是一个单独的请求: 一个验证验证码的Servlet,还有一个验证用户名和密码的Servlet,两次都可能有错误信息返回到前端页面,所以前面页面要从request域中获取返 ...

  8. 第五节,TensorFlow编程基础案例-session使用(上)

    在第一节中我们已经介绍了一些TensorFlow的编程技巧;第一节,TensorFlow基本用法,但是内容过于偏少,对于TensorFlow的讲解并不多,这一节对之前的内容进行补充,并更加深入了解讲解 ...

  9. cookie、session和application都是些什么神?——图文加案例,不怕你不会,就怕你不看

    cookie.session和application都是些什么神? 前言: 一直想写一篇关于cookie和session的博客,由于种种原因,一直没有整理,这不,今天还就遇到问题了,之前虽然会,但是好 ...

随机推荐

  1. C语言-02基本运算

    1.除法运算 / 整数除于整数,还是整数.参与运算的操作数必须是同类型. 1/2的值是0.参与运算的操作数是什么类型,得出的值就是什么类型.   10.5 + 10将右边的10提升为了double类型 ...

  2. POJ 3393 Lucky and Good Months by Gregorian Calendar 模拟题

    题目:http://poj.org/problem?id=3393 不多说了,简单模拟题,因为粗心写错了两个字母,导致错了N遍,模拟还是一贯的恶心,代码实在不想优化了,写的难看了点.. #includ ...

  3. IEnumerable,ICollection,IList,List区别

    做C#的同学们,都知道,一类只能有一个继承类,但可以实现多个接口.这句话就告诉我们:IEnumerable,ICollection,IList,List区别了 首先我看看 IEnumerable: / ...

  4. JavaFX 开发是遇到一些问题记录

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC"; color: #000000; min-he ...

  5. Android源码中的FLAG为何使用16进制

    1.在阅读源码的时候经常发现有一些标志属性使用一些位操作来判断是否具有该标志,增加标志或者去除标志. 比如View.java中的 /** * This view does not want keyst ...

  6. 如何使用Github仓库创建网站

    官方文档:https://help.github.com/categories/github-pages-basics/ 1.创建一个仓库 2.额外建立一个gh-pages分支 3.添加CNAME文件 ...

  7. 排名第一、第二的OCR软件

    排名第一.第二的OCR软件 第一:ABBYY FineReader      OCR世界排名第一,在俄罗斯获国际科技大奖奖超过卡巴斯基! 不仅仅只是文字识别,还能表格识别,版面还原,字体识别,文档结构 ...

  8. 容斥原理算法总结(bzoj 2986 2839)

    容斥原理是一个从小学就开始学习的算法.但是很多难题现在都觉得做的十分吃力. 容斥原理大概有两种表现形式,一种是按照倍数进行容斥,这个东西直接用莫比乌斯函数就可以了. #include<iostr ...

  9. bzoj 1068: [SCOI2007]压缩 DP

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 496  Solved: 315[Submit][Status] D ...

  10. hdu 4762 && 2013 ACM/ICPC 长春网络赛解题报告

    这次的答案是猜出来的,如果做得话应该是应该是一个几何概型的数学题: 答案就是:n/(m^(n-1)); 具体的证明过程: 1.首先枚举这M个点中的的两个端点,概率是:n*(n-1); 2.假设这个蛋糕 ...