以下哪个方法一定可以获取到代表当前会话的session对象

以下哪个方法一定可以获取到代表当前会话的session对象,第1张

1 v$mystat视图

SQL> desc v$mystat

Name Null Type

------------------------------------------------- --------------

SID NUMBER

STATISTIC# NUMBER

VALUE NUMBER

SQL> select sid from v$mystat where rownum=1;

SID

----------

19

2 使用userenv(‘sid’) 直接获取

这种方法只能在oracle 10g以后可以使用。

SQL> select userenv('sid') from dual;

USERENV('SID')

--------------

19

3 结合 userenv('sessionid') 与 v$session 视图

userenv('sessionid') 返回的是session audit id其对应v$session 的audsid字段。

这在之前的blog中有说明。

OracleSYSAUDSES$ 序列 说明

>

0什么是Redis

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

---维基百科

1与其他用户状态保存方案比较

一般开发中用户状态使用session或者cookie,两种方式各种利弊。

Session:在InProc模式下容易丢失,并且引起并发问题。如果使用SQLServer或者SQLServer模式又消耗了性能

Cookie则容易将一些用户信息暴露,加解密同样也消耗了性能。

Redis采用这样的方案解决了几个问题,

1Redis存取速度快。

2用户数据不容易丢失。

3用户多的情况下容易支持集群。

4能够查看在线用户。

5能够实现用户一处登录。(通过代码实现,后续介绍)

6支持持久化。(当然可能没什么用)

2实现思路

1我们知道session其实是在cookie中保存了一个sessionid,用户每次访问都将sessionid发给服务器,服务器通过ID查找用户对应的状态数据。

在这里我的处理方式也是在cookie中定义一个sessionid,程序需要取得用户状态时将sessionid做为key在Redis中查找。

2同时session支持用户在一定时间不访问将session回收。

借用Redis中Keys支持过期时间的特性支持这个功能,但是在续期方面需要程序自行拦截请求调用这个方法(demo有例子)

下面开始代码说明

3Redis调用接口

首先引用ServiceStack相关DLL。

在webconfig添加配置,这个配置用来设置Redis调用地址每台服务用,隔开。主机写在第一位

1 <appSettings>

2

3 <!--每台Redis之间用,分割第一个必须为主机-->

4 <add key="SessionRedis" value="127001:6384,127001:6384"/>

5

6 </appSettings>

初始化配置

static Managers()

{

string sessionRedis= ConfigurationManagerAppSettings["SessionRedis"];

string timeOut = ConfigurationManagerAppSettings["SessionRedisTimeOut"];

if (stringIsNullOrEmpty(sessionRedis))

{

throw new Exception("webconfig 缺少配置SessionRedis,每台Redis之间用,分割第一个必须为主机");

}

if (stringIsNullOrEmpty(timeOut)==false)

{

TimeOut = ConvertToInt32(timeOut);

}

var host = sessionRedisSplit(charParse(","));

var writeHost = new string[] { host[0] };

var readHosts = hostSkip(1)ToArray();

ClientManagers = new PooledRedisClientManager(writeHost, readHosts, new RedisClientManagerConfig

{

MaxWritePoolSize = writeReadCount,//“写”链接池链接数

MaxReadPoolSize = writeReadCount,//“读”链接池链接数

AutoStart = true

});

}

为了控制方便写了一个委托

/// <summary>

/// 写入

/// </summary>

/// <typeparam name="F"></typeparam>

/// <param name="doWrite"></param>

/// <returns></returns>

public F TryRedisWrite<F>(Func<IRedisClient, F> doWrite)

{

PooledRedisClientManager prcm = new Managers()GetClientManagers();

IRedisClient client = null;

try

{

using (client = prcmGetClient())

{

return doWrite(client);

}

}

catch (RedisException)

{

throw new Exception("Redis写入异常Host:" + clientHost + ",Port:" + clientPort);

}

finally

{

if (client != null)

{

clientDispose();

}

}

}

一个调用的例子其他的具体看源码

/// <summary>

/// 以Key/Value的形式存储对象到缓存中

/// </summary>

/// <typeparam name="T">对象类别</typeparam>

/// <param name="value">要写入的集合</param>

public void KSet(Dictionary<string, T> value)

{

Func<IRedisClient, bool> fun = (IRedisClient client) =>

{

clientSetAll<T>(value);

return true;

};

TryRedisWrite(fun);

}

4实现Session

按上面说的给cookie写一个sessionid

/// <summary>

/// 用户状态管理

/// </summary>

public class Session

{

/// <summary>

/// 初始化

/// </summary>

/// <param name="_context"></param>

public Session(>

如果是和>

1要在一般处理程序中获取其他页面的session值,需要引用名空间:

using SystemWebSessionState;

2然后继承一个接口:IRequiresSessionState,如图:

3然后就可以获得session值了:

>

string s =contextSession["Verifycode"]ToString();

怎样在html页面中取得session中的值

方法如下:

1首先呢session的key-value都是存在server的,浏览器HTML页面是没有办法直接取得session中的值,只有在html里能通过js拿到jesessionid之类的东西。

11、数据量如果小,可以考虑放到cookie里,传到客户端,html里用js就可以拿到。

12、如果数据量大,可以考虑单独做一个jsp或servlet,根据传来的session的key,返回序列化的session的值,比如json之类的。html里用js通过ajax获取。这种方式复杂了点,多一次远程访问,但是灵活方便。

如:<input type="text" value='<%#Session["username"]%>'>

2或者得通过后台才能获取,session是存在服务器端的,如果你用cookie的话,可以通过js获取。

比如:写个webservice ajax获取你要的session值 或者 利用利用模板语言输出。

3用responsesendRedirect("ahtmlparam=hello");用下面的JS方法

如:var v=getUrlParameter('param');

function getUrlParameter( name ){

name = namereplace(/[\[]/,"\\\[")replace(/[\]]/,"\\\]");

var regexS = "[\\&]"+name+"=([^])";

var regex = new RegExp( regexS );

var results = regexexec(windowparentlocationhref );

if( results == null ) return ""; else {

return results[1];

}

}

以上几种方法在html页面中取得session中的值

以上就是关于以下哪个方法一定可以获取到代表当前会话的session对象全部的内容,包括:以下哪个方法一定可以获取到代表当前会话的session对象、如何在另一个页面获取session值、如何获取redis管理的session等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9621406.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存