Session案例

用户登入案例:

按一般的网站登入实例,用户在页面登入页输入账号、密码,验证通过后,在首页显示其“欢迎回来,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);
	}

}

  效果如图

  

时间: 2024-08-02 06:59:44

Session案例的相关文章

session案例:防止表单重复提交、一次性校验码

session案例1:防止表单重复提交 原理: 1,表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号. 2,当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号. 3,在下列情况下,服务器程序将拒绝用户提交的表单请求

零基础学习java------29---------网络日志数据session案例,runtime

一. 网络日志数据session案例 部分数据 数据中的字段分别为: 访客ip地址,访客访问时间,访客请求的url及协议,网站响应码,网站返回数据量,访客的referral url,访客的客户端操作系统及浏览器信息 需求: (1) 需要为从访问日志中梳理出每一个session(如果一个用户两次相邻请求之间的时间差<30分钟,则该两次请求都属于同一个session(不考虑不同的URL),否则分属不同的session),并为session中的历次请求打上序号,示意如下: (2) 将每次session

13 Servlet——session案例2:用户登录主页显示用户名和注销登录

案例说明 我们使用原本 第11节的代码进行改进,添加用户登录到主页后显示自己名字的功能和添加注销登录的功能. 思路设计 主页获取用户名设计 在LoginServlet中,我们在判断用户账号密码正确后,跳转主页之前,创建session并将用户对象添加到session中,在主页获取session中的对象即可. 同样地,在3天免登陆的情况下,在cookieServlet中跳转主页之前,创建session并将用户对象添加到session中,在主页获取session中的对象即可. 注销设计 添加一个表单,

Session案例:简易的购物车

三个jsp和两个Servlet组成:在WebContent下边建立一个shoppingcart文件夹,将三个jsp文件放在里面: 1.建立一个step1.jsp文件,出现一个表格,是一个复选框,可以选择要购买的书籍,完毕后,点击Submit,跳转到Servlet类 ProcessStep1Servlet里面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding=

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

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

Session案例_登录注销

index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <h1&

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

一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码,其原理与利用Session防止表单重复提交的原理基本一样,只是将表单标识号变成了验证码的形式,并且要求用户将提示的验证码手工填写进一个表单字段中,而不是通过表单的隐藏字段自动回传给服务器. 服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程. 密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻

一个小的登录查看的session案例

需求 1,创建两个页面,一个是登录页面,一个是登录成功后,显示个人信息的页面2,登录页面是基于session3.数据表(男生,女生,男女关系)4.登录页(用户名,密码,性别,一周免登陆)5.内容页,异性列表和有关系的列表 设计 views的改变 把登陆的代码和关系内容的代码分开,所以创建了views目录,并且把不同的内容写到了不同的模块中.如图各个py文件代码 from django.shortcuts import render,HttpResponse,redirect from app_0

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

cookie.session和application都是些什么神? 前言: 一直想写一篇关于cookie和session的博客,由于种种原因,一直没有整理,这不,今天还就遇到问题了,之前虽然会,但是好久没用又给忘了,结果还得查资料.是时候填坑了,闲话少说,开干. application Application用于保存所有用户的公共的数据信息,在这只是提一下,不过多解释. 下面我主要解说cookie和session,不过在解说之前有必要让大家先了解一下HTTP协议和会话跟踪 HTTP协议 协议是指