想学习关于session的知识

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想学习关于session的知识相关的知识,希望对你有一定的参考价值。

在学Java的过程中
session这块学的不好
不知道怎么运用
哪位大侠给我说一下
或给个地址,我去研究一下!!

Session基于Cookie技术,Session保存在服务器端(一般会设置有效期),SessionID保存在客户端.Session里面保存!!若干个!!!"键-值"对,可以通过 void setAttribute(java.lang.String name, java.lang.Object value) 来修改/添加
HttpSession session = request.getSession();
session.setAttribute("abc",new Integer(567));//新增属性 键:abc 值:new Integer(567)
session.setAttribute("jkl",new Person());//新增属性 键:jkl 值:new Person()
session.setAttribute("abc",new Double(5.67));//已经存在 键abc,将会修改该键对应的值
Session本质上也是一组"键-值"对 其中的"键"保存在客户端(钥匙)是字符串 其中的"值"保存在服务器端(保险箱)可以是Object类型
sessionID与session的关系:钥匙与银行保险箱 钥匙在客户端 保险箱在服务器端
URL重写:解决了关闭浏览器cookie产生的问题
!!!!!!!!!!!!!Session在关闭浏览器时会失效,在下次访问时不能获得同一个Session了

实例:
package chap03;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class GetSession extends HttpServlet

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException

response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();

String user = "";
//此处不新建session,只是去取已经创建的session
HttpSession session = request.getSession(false);
//如果session能够取到,说明用户已经登录
if(session!=null)

user = (String)session.getAttribute("abc");
out.println("获得创建的Session");
out.println("<BR>");
out.println("登录名:"+user);

//否则,说明用户没有登录,跳转到登录页面让用户登录
else

response.sendRedirect("../SessionLogin.htm");


public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException

doGet(request,response);



package chap03;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SaveInfo extends HttpServlet

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException

//验证登录者身份,验证过程此处省略
//如果合法用户就产生一个session来放置其登录名

//如果用户输入了用户名,则将其放在session中
if(request.getParameter("userName")!=null)

HttpSession session = request.getSession();//没有Session就新建一个
session.setAttribute("abc",
request.getParameter("userName"));//在服务器端存储"键-值对"

response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
out.println("Session已经创建");
out.println("<BR>");
out.println("转到其他<A HREF=\"chap03.GetSession\">页面</A>");

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException

doGet(request,response);

参考技术A web 的session 概念都是一样的,只是不同语法有所区别

你先弄清楚sessino的工作原理,http是请求\响应模式,通话完后服务器后台程序是和客户端断开的,所以状态就只能够借助session来保存, 你的有用信息保存在sessinon中一起提交到服务器,服务器做修改后再把session返回给客户端,下面是参考

Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。

具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。

需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器中建立连接时所处的Sessions是两个不同的Session。

那什么是Session的解决方案呢?我们知道,用户访问一个网站时往往需要浏览许多网页。对于一个通过php构筑的网站来说,用户在访问的过程中需要执行许多的PHP脚本。然而由于HTTP协议自身的特点,用户每执行一个PHP脚本都需要和Web服务器重新建立连接。

又由于无状态记忆的特点,此次连接无法得到上次连接的状态。这样,用户在一个PHP脚本中对一个变量进行了赋值操作,而在另外一个PHP脚本中却无法得到这个变量的值。例如,用户在负责登录的PHP脚本中设置了$user="wind",却无法在另一个PHP脚本中通过调用$user来获得“wind”这个值。也就是说,在PHP中无法设置全局变量。每个PHP脚本中所定义的变量都是只在这个脚本内有效的局部变量。
参考技术B Java基础-关于session的详细解释

参考资料:http://java.chinaitlab.com/XMLBeans/388681.html

session存储redis但是对应用透明,项目前后端分离,使用shiro做权限管理的关于session知识点整理

 

        做项目是web的,并且会有移动设备,以及未来会进行分布式部署,所以shiro作为权限管理的时候,就会出现session和应用分离的状况。

        因为redis集成在了session中,所以session对shiro项目来说是透明的,这时,就需要前端能保存jsessionid来对项目进行请求的时候不需要再重新登录。

        因为session存在redis,对我们是透明的,然后shiro关于sessionManager使用的是默认的配置,并没有对SessionDao进行重写。

      然后就是前端携带jsessionId向后端请求了。

        有两种方式,cookie和request header。

        一般情况下,shiro在web端可以直接生成cookie,请求的时候,shiro默认获取cookie中的jsessionid,然后验证通过,调用业务接口。

        在二般情况下呢,cookie被禁止。这时,request header就派上用场了。shiro会解析header的key/value值,所以这时间就可以让前端以cookie:JSESSIONID=XXXXXX的形式向应用请求。

        下面是在postman中验证的过程(时间问题,不贴图了,只做过程描述):

        postman中调用应用的登录接口,就会生成session,将jsessionid存储在cookies,这时header是没有cookie这个属性的。调用业务接口,可以成功。然后我们把浏览器的cookie禁止掉,这时,再调用业务接口,就获取不到jsessionid,也就无法获得session,然后我们把刚才cookie的值放在header中,再次调用业务接口,成功了。并且,测试过程中,把cookie打开,浏览器cookie设置jsessionid为id1,header的cookie设置为jsessionid=id2,此时调用接口获取session,返回的sessionid为id1,所以shiro是默认先获取浏览器的cookie的jsessionid,然后没有浏览器cookie的话,再去查找header的cookie参数的jsessionid的。

        总结,登录成功后将sessionid返回给前端,让前端记录。登陆后前端每次请求接口时,默认设置header的cookie的值jsessionid。这样子第一,不用考虑浏览器是否禁用cookie,其次,满足除了web浏览器之外,移动设备(手持设备)、分布式部署、前后端分离的情况都可以满足。再者,session方面的配置使用shiro的默认设置即可。

        PS,应用的HttpServletSession启动时候就集成redis这个是我们架构师做的,详细的原理我还没了解,暂时不提供解释。上面的方式就是针对目前这类项目(session存储redis但是对应用透明,项目前后端分离,使用shiro做权限管理)的设计做的对策。

        PPS,shiro的session.create底层还是httpServletRequest的HttpSession,参考springmvc集成shiro后,session、request姓汪还是姓蒋?

        

 

以上是关于想学习关于session的知识的主要内容,如果未能解决你的问题,请参考以下文章

你必须了解的Session的本质

session存储redis但是对应用透明,项目前后端分离,使用shiro做权限管理的关于session知识点整理

session存储redis但是对应用透明,项目前后端分离,使用shiro做权限管理的关于session知识点整理

2018/04/21 PHP 中的Session和Cookie知识总结

Session的工作机制详解和安全性问题(PHP实例讲解)

学习笔记47_关于Session局限性问题,Memcache