本发明涉及数据处理,特别涉及一种session获取方法。
背景技术:
1、shiro作为一个java安全框架,提供了会话管理的功能。session称为会话,在负载均衡多个web实例的情况下,需要让shiro支持session的共享,目前行业内多采用redis作为共享session的存储器,采用的方案有两种:第一种是定制shiro的sessionmanager(session管理器)的sessiondao;第二种是采用spring redis session直接把web容器的session代理。
2、在利用基于shiro的spring redis session的方案时,spring redis session将web容器的session代理后,只要web容器发生尝试获取session的动作,若当前请求没有session,那将会创造session到redis中。这样会造成很多无用的session堆积在redis中。例如:有些web项目,会开放一些访问入口给外部作为api调用,这些入口是不需要session的,但调用的某个环节会统一获取session(比如记录访问日志),此时就会在redis中产生一个无用的session,尤其是当这些入口的访问特别多时,就会生产数量特别巨大的无用session。
技术实现思路
1、为了克服现有技术存在的缺陷,本发明提供一种session获取方法,以解决上述的问题。
2、本发明解决其技术问题所采用的技术方案是:一种session获取方法,包括以下步骤:
3、s10:建立过滤器springsplitredissessionfilter,其中,所述过滤器springsplitredissessionfilter继承了过滤器springredissessionfilter;
4、s20:在通过过滤器springsplitredissessionfilter获取用户请求的请求头的referer的值和获取用户请求的url中的.html结尾或.do结尾后,利用springredissessionfilter生成httpservletrequest接口类型对象和httpservletresponse接口类型对象的代理,得到包装器sessionrepositoryrequestwrapper和包装器sessionrepositoryresponsewrapper,然后通过包装器sessionrepositoryrequestwrapper得到spring redis session代理后的session。
5、值得说明的是,所述步骤s20包括:
6、通过过滤器springsplitredissessionfilter获取用户请求的请求头,判断请求头中是否有referer的值;
7、若否,则不用springredissessionfilter生成httpservletrequest接口类型对象和httpservletresponse接口类型对象的代理;
8、若是,则判断用户请求的url是否以.html或.do结尾;若否则不用springredissessionfilter生成httpservletrequest接口类型对象和httpservletresponse接口类型对象的代理;若是则使用springredissessionfilter去生成httpservletrequest接口类型对象和httpservletresponse接口类型对象的代理。
9、具体地,在所述步骤s20后,还包括步骤s30和步骤s40;
10、步骤s30包括:建立序列化和反序列化的工具springsessionshiroserializer;
11、步骤s40包括:利用序列化和反序列化的工具springsessionshiroserializer将shiro保存到session内。
12、可选的,所述步骤s40包括:所述序列化和反序列化的工具springsessionshiroserializer在序列化savedrequest类型对象时,先将savedrequest类型对象转化为springsessionsavedrequestadapter类型对象,然后将springsessionsavedrequestadapter类型对象序列化到redis中。
13、优选的,所述步骤s40还包括:所述序列化和反序列化的工具springsessionshiroserializer在反序列化savedrequest类型对象时,先从redis中反序列化出springsessionsavedrequestadapter类型对象;然后将springsessionsavedrequestadapter类型对象转化成springsessionsavedhttpservletadapter类型对象,实现httpservletrequest接口;再通过savedrequest类型的构造函数savedrequest(httpservletrequest request)建立savedrequest类型对象。
14、值得说明的是,所述步骤s40还包括:所述序列化和反序列化的工具springsessionshiroserializer在序列化simpleprincipalcollection类型对象时,先取出用户信息对象,然后对用户信息对象序列化。
15、具体地,所述步骤s40还包括:所述序列化和反序列化的工具springsessionshiroserializer在反序列化simpleprincipalcollection类型对象时,先反序列化出用户信息对象,然后通过simpleprincipalcollection类型构造函数simpleprincipalcollection(object用户信息,string realmname)建立simpleprincipalcollection类型对象。
16、本发明的有益效果在于:在所述session获取方法中,通过referer的值和url中的.html结尾或.do结尾,能精准确定需要产生的session是否有用,并且只产生有用的session,如此,就能避免无效session的产生,从而避免产生数量特别巨大的无用session,降低了系统的冗余性。
1.一种session获取方法,其特征在于,包括以下步骤:
2.根据权利要求1所述一种session获取方法,其特征在于,所述步骤s20包括:
3.根据权利要求2所述一种session获取方法,其特征在于:在所述步骤s20后,还包括步骤s30和步骤s40;
4.根据权利要求3所述一种session获取方法,其特征在于,所述步骤s40包括:所述序列化和反序列化的工具springsessionshiroserializer在序列化savedrequest类型对象时,先将savedrequest类型对象转化为springsessionsavedrequestadapter类型对象,然后将springsessionsavedrequestadapter类型对象序列化到redis中。
5.根据权利要求4所述一种session获取方法,其特征在于,所述步骤s40还包括:所述序列化和反序列化的工具springsessionshiroserializer在反序列化savedrequest类型对象时,先从redis中反序列化出springsessionsavedrequestadapter类型对象;然后将springsessionsavedrequestadapter类型对象转化成springsessionsavedhttpservletadapter类型对象,实现httpservletrequest接口;再通过savedrequest类型的构造函数savedrequest(httpservletrequest request)建立savedrequest类型对象。
6.根据权利要求5所述一种session获取方法,其特征在于,所述步骤s40还包括:所述序列化和反序列化的工具springsessionshiroserializer在序列化simpleprincipalcollection类型对象时,先取出用户信息对象,然后对用户信息对象序列化。
7.根据权利要求6所述一种session获取方法,其特征在于,所述步骤s40还包括:所述序列化和反序列化的工具springsessionshiroserializer在反序列化simpleprincipalcollection类型对象时,先反序列化出用户信息对象,然后通过simpleprincipalcollection类型构造函数simpleprincipalcollection(object用户信息,string realmname)建立simpleprincipalcollection类型对象。