欢迎来到【魔兽世界网页源码】【电玩城源码定制】【单号网源码下载】httpsession实现源码-皮皮网网站!!!

皮皮网

【魔兽世界网页源码】【电玩城源码定制】【单号网源码下载】httpsession实现源码-皮皮网 扫描左侧二维码访问本站手机端

【魔兽世界网页源码】【电玩城源码定制】【单号网源码下载】httpsession实现源码

2024-11-30 07:49:04 来源:{typename type="name"/} 分类:{typename type="name"/}

1.httpsessionʵ?现源?Դ??
2.求vc写的直接从一个网站上下载exe程序得源代码!
3.博达远创对cookie技术的原理怎么看?
4.单点登录SSO原理和实现

httpsession实现源码

httpsessionʵ??Դ??

       对于一个帐号在同一时间只能一个人登录,可以通过下面的现源方法实现:

       1 .在用户登录时,把用户添加到一个ArrayList中

       2 .再次登录时查看ArrayList中有没有该用户,现源如果ArrayList中已经存在该用户,现源则阻止其登录

       3 .当用户退出时,现源需要从该ArrayList中删除该用户,现源魔兽世界网页源码这又分为三种情况

       ① 使用注销按钮正常退出

       ② 点击浏览器关闭按钮或者用Alt+F4退出,现源可以用javascript捕捉该页面关闭事件,现源

       执行一段java方法删除ArrayList中的现源用户

       ③ 非正常退出,比如客户端系统崩溃或突然死机,现源可以采用隔一段时间session没活动就删除该session所对应的现源用户来解决,这样用户需要等待一段时间之后就可以正常登录。现源

       在LoginAction中定义:

       // 用来在服务器端存储登录的现源所有帐号

       public static List logonAccounts;

       login() 登录方法中:

       // 设置session不活动时间为分

       request.getSession().setMaxInactiveInterval(*);

       if(logonAccounts==null){

        logonAccounts = new ArrayList();

       }

       // 查看ArrayList中有没有该用户

       for (int i = 0; i < logonAccounts.size(); i++) {

        Account existAccount = (Account)logonAccounts.get(i);

        if(account.getAccountId().equals(existAccount.getAccountId())){

        return "denied";

        }

       }

       // 在用户登录时,把sessionId添加到一个account对象中

       // 在后面 ③ 需要根据此sessionId删除相应用户

       account.setSessionId(request.getSession().getId());

       // 该用户保存到ArrayList静态类变量中

       logonAccounts.add(account);

       return "login";

       ① 使用注销按钮正常退出

       logout() 退出方法中:

       if(logonAccounts==null){

        logonAccounts = new ArrayList();

       }

       // 删除ArrayList中的现源用户 ⑴

       for (int i = 0; i < logonAccounts.size(); i++) {

        Account existAccount = (Account)logonAccounts.get(i);

        if(account.getAccountId().equals(existAccount.getAccountId())){

        logonAccounts.remove(account);

        }

       }

       ② 点击浏览器关闭按钮或者用Alt+F4退出:

       在后台弹出一个窗口,在弹出窗口中删除ArrayList中的现源用户

       function window.onbeforeunload(){

       // 是否通过关闭按钮或者用Alt+F4退出

       // 如果为刷新触发onbeforeunload事件,下面if语句不执行

        if (event.clientX>document.body.clientWidth && event.clientY<0||event.altKey){

        window.open('accountUnbound.jsp','',

        'height=0,width=0,top=,left=')

        }

       }

       accountUnbound.jsp : 弹出窗口中删除ArrayList中的用户

       <%

        Account account = (Account) request.getSession().getAttribute("account");

        if(account != null){

        if(LoginAction.logonAccounts==null){

        LoginAction.logonAccounts = new ArrayList();

        }

        // 删除ArrayList中的用户——下面代码和上面的 ⑴ 处一样

        for (int i = 0; i < logonAccounts.size(); i++) {

        Account existAccount = (Account)logonAccounts.get(i);

        if(account.getAccountId().equals(existAccount.getAccountId())){

        logonAccounts.remove(account);

        }

        }

        }

       %>

       为了保证上面代码可以执行完毕,3秒后关闭此弹出窗口(也位于accountUnbound.jsp中)

       <script>

       setTimeout("closeWindow();",);

       function closeWindow(){

        window.close();

       }

       </script>

       ③ 使LoginAction 实现implements HttpSessionListener,并实现sessionCreated,sessionDestroyed方法,在sessionDestroyed中删除ArrayList中的用户(用户超过分钟不活动则执行此方法)

       public void sessionDestroyed(HttpSessionEvent event) {

        // 取得不活动时的sessionId,并根据其删除相应logonAccounts中的用户

        String sessionId = event.getSession().getId();

        for (int i = 0; i < logonAccounts.size(); i++) {

        Account existAccount = (Account)logonAccounts.get(i);

        if(account.getSessionId().equals(existAccount.getSessionId())){

        logonAccounts.remove(account);

        }

        }

       }

       注:

       对于上面的,由于弹出窗口很容易被防火墙或者安全软件阻拦,电玩城源码定制造成无法弹出窗口,从而短时间不能登录,这种情况可以用AJAX来代替弹出窗口,同样在后台执行删除用户的那段代码,却不会受到防火墙限制:

       <script>

        // <![CDATA[

        var 时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到您的站点。

       Cookie 有哪些用途?

       最根本的用途是:Cookie 能够帮助 Web 站点保存有关访问者的信息。更概括地说,单号网源码下载Cookie 是一种保持Web 应用程序连续性(即执行“状态管理”)的方法.使 Web 站点记住您.

       什么是会话Session?

       当用户访问您的站点时,服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束。

       参考地址

       /china/MSDN/library/archives/library/dv_vstechart/html/vbtchaspnetcookies.asp

       /default.aspx?scid=kb;en-us;

       cookie欺骗原理

       正如我们所知道的,在网络词汇中,cookie是一个特殊的信息,虽然只是服务器存于用户计算机上的一个文本文件,但由于其内容的不寻常性(与服务器有一定的互交性,且常会存储用户名,甚至口令,etc挖矿源码或是其它一些敏感信息,例如在江湖或是一些社区中,常会用cookie来保存用户集分,等级等等)。因而成为一些高手关注的对象,借此来取得特殊权限,甚至攻克整个网站。以下是自己在xp,上做过的测试关于javascrīpt中对cookie的应用。

       一、cookie的源码 版权声明格式建立

       在讲如何建立cookie之前,我们先来了解一下cookie的基本格式:

       cookiename+cookievalue;expire=expirationdategmt;path=urlpath;domain=sitedomain

       其中各项以;分开,首先是指定cookie的名称,并为其赋值。接下来分别是cookie的有效期,url路径以及域名,在这几项中,除了第一项以外,其它部分均为可先项。

       我们来看一段代码,了解一下cookie究竟是怎样建立的:

       <HTML><HEAD><TITLE>Set a cookie based on a form</TITLE> 

       <scrīpt LANGUAGE=javascrīpt>

       <!--

       expireDate = new Date;

       expireDate.setMonth(expireDate.getMonth()+6);

       userName = "" ;

       if (document.cookie!="") {

       userName =document.cookie.split("=")[1];

       }

       function nameField_onblur() {

       var userName;

       userName=document.myform.nameField.value;

       document.cookie="userName="+userName+";expires="+expireDate.toGMTString();

       alert(document.cookie);

       }

       //-->

       </scrīpt></HEAD>

       <BODY BGCOLOR="WHITE" ōnLoad="document.myform.nameField.value = userName">

       <form NAME="myform">

       <H1>Enter your name:

       <INPUT TYPE="TEXT" NAME="nameField" ōnBlur="return nameField_onblur()"></H1>

       </form></BODY></HTML>

       1,<scrīpt LANGUAGE="java scrīpt" TYPE="TEXT/javascrīpt">

       脚本开始的标记,由此一句告诉浏览器以下将是javascrīpt.

       2,<!-- Hide scrīpt from older browsers

       为了防止浏览器不能识别脚本,而让浏览器误以为是HTML注释而忽略它。

       3,expireDate = new Date

       获取当前日期,并存入变量expireDate中。

       4,expireDate.setMonth(expireDate.getMonth()+6)

       获取当前月份值,将其加6后设置为expireDate的月份总值部分。这意味着本cookie的有效期为6个月。

       5,if (document.cookie != "")

       如果document的值不为空,相当于检查用户硬盘上是否已经有了cookie。

       6,userName = document.cookie.split("=")[1]

       此处用到了split("=")函数,它的功能是把cookie记录分割为数组,cookie的名为cookie[0],值为cookie[1],以此类推。所以此处document.cookie.split("=")[1]返回的值是此cookie的值。在此句中将值赋给了变量userName。

       7,function nameField_onblur()()

       设置名为nameField_onblur()的函数。

       8,document.cookie = "userName="+userName+";expires=" + expireDate.toGMTString()

       此句是将设置好的cookie写入用户硬盘。expireDate.toGMTString()把expireDate中的值转换为文本字符串,这样才能写入cookie中。

       9,onLoad="document.myform.nameField.value = userName"

       当页面载入时,把username的值写入文本框(如果有的话)。

       ,onBlur="nameField_onblur()"

       当用户离开文本框时,onBlur调用函数nameField_onblur()。

       既然我们可以建立cookie,那么读取也不是什么难事,请接着往下看!

       二、读取和显示cookie

       一般来说,cookie的作者并不希望cookie被显示出来,这是当然的!天知道里面写了些什么!?然而这也是我们想要读出它的原因!~~~:D

       <HTML><HEAD><TITLE>Cookie Check</TITLE></HEAD>

       <BODY BGCOLOR="WHITE">

       <H2>

       <scrīpt LANGUAGE=javascrīpt> 

       <!-- Hide scrīpt from older browsers

       var thisCookie;

       if (document.cookie == "") {

单点登录SSO原理和实现

       æ¬¢è¿Žå¤§å®¶å…³æ³¨?github.com/hsfxuebao?,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈

1. 单系统登录机制1.1 / 和?/index.html ?否 同源(协议、域名、端口号相同)

       / 和?/index.html?跨域 协议不同(/ 和?百度一下,你就知道?跨域 主域名不同(test/baidu)

       /? 和 /?跨域 子域名不同(www/blog)

       :/?和 :/?跨域 端口号不同(/)

2.3 多系统解决方案

       è™½ç„¶å•ç³»ç»Ÿçš„登录解决方案很完美,但对于多系统应用群已经不再适用了,为什么呢?

       å•ç³»ç»Ÿç™»å½•è§£å†³æ–¹æ¡ˆçš„核心是cookie,cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名),浏览器发送”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。然而,可行并不代表好,共享cookie的方式存在众多局限:

       é¦–先,应用群域名得统一;

       å…¶æ¬¡ï¼Œåº”用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;

       ç¬¬ä¸‰ï¼Œcookie本身不安全。

       å› æ­¤ï¼Œæˆ‘们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录

3. 单点登录

       ä»€ä¹ˆæ˜¯å•ç‚¹ç™»å½•ï¼Ÿå•ç‚¹ç™»å½•å…¨ç§°Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分

3.1 登录

       ç›¸æ¯”于单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。这个过程,也就是单点登录的原理,用下图说明

       ä¸‹é¢å¯¹ä¸Šå›¾ç®€è¦æè¿°:

       ç”¨æˆ·è®¿é—®ç³»ç»Ÿ1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数

       sso认证中心发现用户未登录,将用户引导至登录页面

       ç”¨æˆ·è¾“入用户名密码提交登录申请

       sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌

       sso认证中心带着令牌跳转会最初的请求地址(系统1)

       ç³»ç»Ÿ1拿到令牌,去sso认证中心校验令牌是否有效

       sso认证中心校验令牌,返回有效,注册系统1

       ç³»ç»Ÿ1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源

       ç”¨æˆ·è®¿é—®ç³»ç»Ÿ2的受保护资源

       ç³»ç»Ÿ2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数

       sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌

       ç³»ç»Ÿ2拿到令牌,去sso认证中心校验令牌是否有效

       sso认证中心校验令牌,返回有效,注册系统2

       ç³»ç»Ÿ2使用该令牌创建与用户的局部会话,返回受保护资源

       ç”¨æˆ·ç™»å½•æˆåŠŸä¹‹åŽï¼Œä¼šä¸Žsso认证中心及各个子系统建立会话,用户与sso认证中心建立的会话称为全局会话,用户与各个子系统建立的会话称为局部会话,局部会话建立之后,用户访问子系统受保护资源将不再通过sso认证中心,全局会话与局部会话有如下约束关系:

       å±€éƒ¨ä¼šè¯å­˜åœ¨ï¼Œå…¨å±€ä¼šè¯ä¸€å®šå­˜åœ¨

       å…¨å±€ä¼šè¯å­˜åœ¨ï¼Œå±€éƒ¨ä¼šè¯ä¸ä¸€å®šå­˜åœ¨

       å…¨å±€ä¼šè¯é”€æ¯ï¼Œå±€éƒ¨ä¼šè¯å¿…须销毁

       ä½ å¯ä»¥é€šè¿‡åšå®¢å›­ã€ç™¾åº¦ã€csdn、淘宝等网站的登录过程加深对单点登录的理解,注意观察登录过程中的跳转url与参数

3.2 注销

       å•ç‚¹ç™»å½•è‡ªç„¶ä¹Ÿè¦å•ç‚¹æ³¨é”€ï¼Œåœ¨ä¸€ä¸ªå­ç³»ç»Ÿä¸­æ³¨é”€ï¼Œæ‰€æœ‰å­ç³»ç»Ÿçš„会话都将被销毁,用下面的图来说明

       sso认证中心一直监听全局会话的状态,一旦全局会话销毁,监听器将通知所有注册系统执行注销操作

       ä¸‹é¢å¯¹ä¸Šå›¾ç®€è¦è¯´æ˜Ž:

       ç”¨æˆ·å‘系统1发起注销请求

       ç³»ç»Ÿ1根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求

       sso认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址

       sso认证中心向所有注册系统发起注销请求

       å„注册系统接收sso认证中心的注销请求,销毁局部会话

       sso认证中心引导用户至登录页面

4. 实现

       åªæ˜¯ç®€è¦ä»‹ç»ä¸‹åŸºäºŽjava的实现过程,不提供完整源码,明白了原理,我相信你们可以自己实现。sso采用客户端/服务端架构,我们先看sso-client与sso-server要实现的功能(下面:sso认证中心=sso-server)

       sso-client:

       æ‹¦æˆªå­ç³»ç»Ÿæœªç™»å½•ç”¨æˆ·è¯·æ±‚,跳转至sso认证中心

       æŽ¥æ”¶å¹¶å­˜å‚¨sso认证中心发送的令牌

       ä¸Žsso-server通信,校验令牌的有效性

       å»ºç«‹å±€éƒ¨ä¼šè¯

       æ‹¦æˆªç”¨æˆ·æ³¨é”€è¯·æ±‚,向sso认证中心发送注销请求

       æŽ¥æ”¶sso认证中心发出的注销请求,销毁局部会话

       sso-server:

       éªŒè¯ç”¨æˆ·çš„登录信息

       åˆ›å»ºå…¨å±€ä¼šè¯

       åˆ›å»ºæŽˆæƒä»¤ç‰Œ

       ä¸Žsso-client通信发送令牌

       æ ¡éªŒsso-client令牌有效性

       ç³»ç»Ÿæ³¨å†Œ

       æŽ¥æ”¶sso-client注销请求,注销所有会话

       æŽ¥ä¸‹æ¥ï¼Œæˆ‘们按照原理来一步步实现sso吧!

4.1 sso-client拦截未登录请求

       java拦截请求的方式有servlet、filter、listener三种方式,我们采用filter。在sso-client中新建LoginFilter.java类并实现Filter接口,在doFilter()方法中加入对未登录用户的拦截

public?void?doFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?chain)?throws?IOException,?ServletException?{ HttpServletRequest?req?=?(HttpServletRequest)?request;HttpServletResponse?res?=?(HttpServletResponse)?response;HttpSession?session?=?req.getSession();if?(session.getAttribute("isLogin"))?{ chain.doFilter(request,?response);return;}//跳转至sso认证中心res.sendRedirect("sso-server-url-with-system-url");}4.2 sso-server拦截未登录请求

       æ‹¦æˆªä»Žsso-client跳转至sso认证中心的未登录请求,跳转至登录页面,这个过程与sso-client完全一样

4.3 sso-server验证用户登录信息

       ç”¨æˆ·åœ¨ç™»å½•é¡µé¢è¾“入用户名密码,请求登录,sso认证中心校验用户信息,校验成功,将会话状态标记为“已登录”

@RequestMapping("/login")public?String?login(String?username,?String?password,?HttpServletRequest?req)?{ this.checkLoginInfo(username,?password);req.getSession().setAttribute("isLogin",?true);return?"success";}4.4、sso-server创建授权令牌

       æŽˆæƒä»¤ç‰Œæ˜¯ä¸€ä¸²éšæœºå­—符,以什么样的方式生成都没有关系,只要不重复、不易伪造即可,下面是一个例子

String?token?=?UUID.randomUUID().toString();4.5、sso-client取得令牌并校验

       sso认证中心登录后,跳转回子系统并附上令牌,子系统(sso-client)取得令牌,然后去sso认证中心校验,在LoginFilter.java的doFilter()中添加几行

//?请求附带token参数String?token?=?req.getParameter("token");if?(token?!=?null)?{ //?去sso认证中心校验tokenboolean?verifyResult?=?this.verify("sso-server-verify-url",?token);if?(!verifyResult)?{ res.sendRedirect("sso-server-url");return;}chain.doFilter(request,?response);}

       verify()方法使用/xuxueli/xxl…Downloadgitee.com/xuxueli…Download5.4 文档地址

       ä¸­æ–‡æ–‡æ¡£

5.5 项目结构说明HttpSession?session?=?request.getSession();session.getAttribute("isLogin");.6 基于Token方式部署

       ç”±äºŽå‰åŽç«¯åˆ†ç¦»å¼€å‘的模式较多,这里只介绍基于Token方式部署,在一些无法使用Cookie的场景下,可使用该方式,如需要Cookie查看基于cookie方式部署

5.6.1 认证中心(SSO Server)搭建

       é¡¹ç›®åï¼šxxl-sso-server

       é…ç½®æ–‡ä»¶ä½ç½®ï¼šapplication.properties

HttpSession?session?=?request.getSession();session.getAttribute("isLogin");.6.2 单点登陆Client端搭建

       é¡¹ç›®åï¼šxxl-sso-token-sample-springboot

       maven依赖

HttpSession?session?=?request.getSession();session.getAttribute("isLogin");3

       é…ç½®æ–‡ä»¶ï¼šapplication.properties

HttpSession?session?=?request.getSession();session.getAttribute("isLogin");4

       é…ç½® XxlSsoTokenFilter

HttpSession?session?=?request.getSession();session.getAttribute("isLogin");.6.3 验证 (模拟请求 Token 方式接入SSO的接口)

       ä¿®æ”¹Host文件:域名方式访问认证中心,模拟跨域与线上真实环境

HttpSession?session?=?request.getSession();session.getAttribute("isLogin");6

       åˆ†åˆ«è¿è¡Œ "xxl-sso-server" 与 "xxl-sso-token-sample-springboot"

       è®¤è¯ä¸­å¿ƒæ­å»ºæˆåŠŸåŽï¼Œé»˜è®¤ä¸ºToken方式登陆提供API接口:

       1、登陆接口:/app/login

       code: 表示成功、其他失败

       msg:错误提示

       data: 登陆用户的 sso sessionid

       username:账号

       password:账号

       å‚数:POST参数

       å“åº”:JSON格式

       2、注销接口:/app/logout

       code: 表示成功、其他失败

       msg:错误提示

       sessionId:登陆用户的 sso sessionid

       å‚数:POST参数

       å“åº”:JSON格式

       3、登陆状态校验接口:/app/l