java中session对象登录_JavaWeb中Session对象的学习笔记

一、Session简单介绍

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

二、Session和Cookie的主要区别

Cookie是把用户的数据写给用户的浏览器。

Session技术把用户的数据写到用户独占的session中。

Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

三、session实现原理

3.1、服务器是如何实现一个session为一个用户浏览器服务的?

服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。可以用如下的代码证明:

package xdp.gacl.session;

import java.io.IOException;

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 SessionDemo1 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setCharacterEncoding("UTF=8");

response.setContentType("text/html;charset=UTF-8");

//使用request对象的getSession()获取session,如果session不存在则创建一个

HttpSession session = request.getSession();

//将数据存储到session中

session.setAttribute("data", "孤傲苍狼");

//获取session的Id

String sessionId = session.getId();

//判断session是不是新创建的

if (session.isNew()) {

response.getWriter().print("session创建成功,session的id是:"+sessionId);

}else {

response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

第一次访问时,服务器会创建一个新的sesion,并且把session的Id以cookie的形式发送给客户端浏览器,如下图所示:

b58f67b163daf09271aabe0b5039772c.png

点击刷新按钮,再次请求服务器,此时就可以看到浏览器再请求服务器时,会把存储到cookie中的session的Id一起传递到服务器端了,如下图所示:

4bb3fb17292244ae48033f1bbc91f050.png

我猜想request.getSession()方法内部新创建了Session之后一定是做了如下的处理

//获取session的Id

String sessionId = session.getId();

//将session的Id存储到名字为JSESSIONID的cookie中

Cookie cookie = new Cookie("JSESSIONID", sessionId);

//设置cookie的有效路径

cookie.setPath(request.getContextPath());

response.addCookie(cookie);

四、浏览器禁用Cookie后的session处理

4.1、IE8禁用cookie

工具->internet选项->隐私->设置->将滑轴拉到最顶上(阻止所有cookies)

4.2、解决方案:URL重写

response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。

response.encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写

4.3、范例:禁用Cookie后servlet共享Session中的数据

IndexServlet

package xdp.gacl.session;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.Set;

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 out = response.getWriter();

//创建Session

request.getSession();

out.write("本网站有如下书:
");

Set> set = DB.getAll().entrySet();

for(Map.Entry me : set){

Book book = me.getValue();

String url =request.getContextPath()+ "/servlet/BuyServlet?id=" + book.getId();

//response. encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写

url = response.encodeURL(url);//将超链接的url地址进行重写

out.println(book.getName() + " 购买
");

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

/**

* @author gacl

* 模拟数据库

*/

class DB{

private static Map map = new LinkedHashMap();

static{

map.put("1", new Book("1","javaweb开发"));

map.put("2", new Book("2","spring开发"));

map.put("3", new Book("3","hibernate开发"));

map.put("4", new Book("4","struts开发"));

map.put("5", new Book("5","ajax开发"));

}

public static Map getAll(){

return map;

}

}

class Book{

private String id;

private String name;

public Book() {

super();

}

public Book(String id, String name) {

super();

this.id = id;

this.name = name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

BuyServlet

package xdp.gacl.session;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

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 BuyServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String id = request.getParameter("id");

Book book = DB.getAll().get(id); //得到用户想买的书

HttpSession session = request.getSession();

List list = (List) session.getAttribute("list"); //得到用户用于保存所有书的容器

if(list==null){

list = new ArrayList();

session.setAttribute("list", list);

}

list.add(book);

//response. encodeRedirectURL(java.lang.String url)用于对sendRedirect方法后的url地址进行重写

String url = response.encodeRedirectURL(request.getContextPath()+"/servlet/ListCartServlet");

System.out.println(url);

response.sendRedirect(url);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

ListCartServlet

package xdp.gacl.session;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.List;

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 ListCartServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

PrintWriter out = response.getWriter();

HttpSession session = request.getSession();

List list = (List) session.getAttribute("list");

if(list==null || list.size()==0){

out.write("对不起,您还没有购买任何商品!!");

return;

}

//显示用户买过的商品

out.write("您买过如下商品:
");

for(Book book : list){

out.write(book.getName() + "
");

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

在禁用了cookie的IE8下的运行效果如下:

4a230c5fda7c5641005af4cb5294ea36.gif

演示效果

通过查看IndexServlet生成的html代码可以看到,每一个超链接后面都带上了session的Id,如下所示

//本网站有如下书:


javaweb开发

购买

//spring开发

购买

// hibernate开发

购买

//struts开发

购买

//ajax开发

购买

所以,当浏览器禁用了cookie后,就可以用URL重写这种解决方案解决Session数据共享问题。而且response. encodeRedirectURL(java.lang.String url) 和response. encodeURL(java.lang.String url)是两个非常智能的方法,当检测到浏览器没有禁用cookie时,那么就不进行URL重写了。我们在没有禁用cookie的火狐浏览器下访问,效果如下:

7e765187fb59abe28db6a44a3ad7dccc.gif

从演示动画中可以看到,浏览器第一次访问时,服务器创建Session,然后将Session的Id以Cookie的形式发送回给浏览器,response. encodeURL(java.lang.String url)方法也将URL进行了重写,当点击刷新按钮第二次访问,由于火狐浏览器没有禁用cookie,所以第二次访问时带上了cookie,此时服务器就可以知道当前的客户端浏览器并没有禁用cookie,那么就通知response. encodeURL(java.lang.String url)方法不用将URL进行重写了。

五、session对象的创建和销毁时机

5.1、session对象的创建时机

在程序中第一次调用request.getSession()方法时就会创建一个新的Session,可以用isNew()方法来判断Session是不是新创建的

范例:创建session

//使用request对象的getSession()获取session,如果session不存在则创建一个

HttpSession session = request.getSession();

//获取session的Id

String sessionId = session.getId();

//判断session是不是新创建的

if (session.isNew()) {

response.getWriter().print("session创建成功,session的id是:"+sessionId);

}else {

response.getWriter().print("服务器已经存在session,session的id是:"+sessionId);

}

5.2、session对象的销毁时机

session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间,例如:

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

index.jsp

15

当需要在程序中手动设置Session失效时,可以手工调用session.invalidate方法,摧毁session。

1 HttpSession session = request.getSession();

2 //手工调用session.invalidate方法,摧毁session

3 session.invalidate();

以上就是本文的全部内容,希望对大家学习session有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vux flexbox使用_Flexbox用大的,彩色的动画gif进行解释

vux flexbox使用Here are three links worth your time:这是三个值得您花费时间的链接: How Flexbox works — explained with big, colorful, animated gifs (5 minute read) Flexbox的工作原理-带有大尺寸,彩色动画gif动画( 阅读5分钟 ) How to commi…

微信小程序 没有找到 node_modules 目录

在学习小程序云开发的时候,遇到一个问题,使用npm i --production 和npm i vant-weapp -S --production之后,在微信开发者工具中并没有node_modules文件夹 但是在根目录下生成了一个package-lock.json文件。也就是下载的依赖都已经装好了&…

关于Unity中UI中的Image节点以及它的Image组件

一、图片的Inspector面板属性 Texture Type:一般是选择sprite(2D and UI) Sprite Mode:一般是选择Single Packing Tag:打包的标志值,最后打包的时候会把Tag相同的所有小图打包成一个大图。不像cocos打包图集需要用到第三方软件&am…

Knockoutjs官网翻译系列(一)

最近马上要开始一个新项目的研发,作为第一次mvvm应用的尝试,我决定使用knockoutjs框架。作为学习的开始就从官网的Document翻译开始吧,这样会增加印象并加入自己的思考,说是翻译也并不是纯粹的翻译,会加入自己对知识点的思考以及自…

无人机导航定位系统Java_无人机高精度室内定位导航的技术方案

原标题:无人机高精度室内定位导航的技术方案因为一些特殊的用途,比如室内表演,编队室内飞行等,无人机不可避免会在室内飞行,无人机对室内定位精度的要求很高,室内空间本身就不会太大,若定位精度…

javascript控制台_如何充分利用JavaScript控制台

javascript控制台by Darryl Pargeter达里尔帕格特(Darryl Pargeter) 如何充分利用JavaScript控制台 (How to get the most out of the JavaScript console) One of the most basic debugging tools in JavaScript is console.log(). The console comes with several other use…

Django之静态文件配置

静态文件 了解静态文件配置之前,我们需要知道静态文件是什么? 静态文件其实指的是像css,js,img等一些被模板需要的文件。 如何在Django中配置我们的静态文件 1.建立static文件夹,将静态文件放在该目录下 2.在settings文件下配置如…

神奇的图像处理算法

http://blog.chinaunix.net/uid-23065002-id-4392043.html http://blog.csdn.net/k_shmily/article/details/51138154 几周前,我介绍了相似图片搜索。 这是利用数学算法,进行高难度图像处理的一个例子。事实上,图像处理的数学算法&#xff0c…

JavaWeb项目前端规范(采用命名空间使js深度解耦合)

没有规矩不成方圆,一个优秀的代码架构不仅易于开发和维护,而且是一门管理与执行的艺术。 这几年来经历了很多项目,对代码之间的强耦合及书写不规范,维护性差等问题深恶痛绝。在这里,通过仔细分析后,结合自己…

java重要基础知识点_java基础知识点整理

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼java基础知识点整理1.&和&&的区别?&:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true。&&:短路与,如果第一个表达式为false时&#…

网易云音乐的算法有什么特点_当算法设计音乐厅时会发生什么?

网易云音乐的算法有什么特点Here are three links worth your time:这是三个值得您花费时间的链接: What happens when algorithms design a concert hall? (3 minute read) 当算法设计音乐厅时会发生什么? ( 阅读3分钟 ) How to land a top-notch tec…

开机发现超级管理员账户不见了

今天出现了一个怪现象,连接打印机的电脑上没有超级管理员账户,只有一个刚建立的新账户,这是怎们回事来?嗳,原来啊,安装Windows XP时,如果又设置了一个管理员账户,那么系统内置没有密…

vs自带iis局域网调试

http://www.cnblogs.com/liluping860122/p/4685564.html转载于:https://www.cnblogs.com/wcLT/p/5594252.html

java.util.set cannot be assigned from null_Java中有关Null的9件事

对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。Java为什么要保留null呢?null出现有一段时间了,并且我认为Java发明者知道null与它解决的问题相比带来了更多的麻烦&…

node.js事件驱动_了解Node.js事件驱动架构

node.js事件驱动by Samer Buna通过Samer Buna 了解Node.js事件驱动架构 (Understanding Node.js Event-Driven Architecture) Update: This article is now part of my book “Node.js Beyond The Basics”.更新:这篇文章现在是我的书《超越基础的Node.js》的一部分…

如何基于 Notadd 构建 API (Laravel 写 API)

如何基于 Notadd 构建 API Notadd 底层实现了 passport 机制,有统一的授权管理,主要支持两种方式进行 API 授权,一个是 client,领一个是 passport,这个在其他文档中有做详细的说明。 这里主要说的是,如何基…

mysql 基于集_一种基于记录集查找特定行的方法_MySQL

问:我的一个表中包含了名为IdValue的单列主键。对于给定的IdValue值,我希望找到紧邻目标值之前和之后的表行(假定结果按IdValue排序)。怎样才能不使用游标而通过一个基于集合的方法得到需要的结果?答:Transact-SQL是一个基于集合的…

react 交互_如何在React中建立动画微交互

react 交互Microinteractions guide a user through your application. They reinforce your user experience and provide delight.微交互引导用户完成您的应用程序。 它们可以增强您的用户体验并带来愉悦感。 You may have seen some of the slick examples of microinterac…

HTTPS与MITM

HTTPS:基于SSL/TSL的HTTP协议 MITM:Man-In-The-Middle中间人攻击 Https下中间人攻击的思路: 1 去https化 2 向CA申请相似域名的证书 防范: 睁大双眼转载于:https://www.cnblogs.com/the-owl/p/5596254.html

PCB genesis自制孔点 Font字体实现方法

一.先看genesis原有Font字体 在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个性化需求,比如:孔密度,孔间距,孔形状分布,如果有一…