精华内容
下载资源
问答
  • Session管理

    千次阅读 2018-10-16 21:46:58
    1、session抽象类是一个主要有4个接口,session实现着4个接口,就可以完成整个session管理功能 class session { public: virtual void close() = 0; virtual void send_data(unsigned char* body, int len) = 0;...

    1、session抽象类是一个主要有4个接口,session实现着4个接口,就可以完成整个session管理功能

    class session {
    public:
    	virtual void close() = 0;
    	virtual void send_data(unsigned char* body, int len) = 0;
    	virtual const char* get_address(int* c_port) = 0;
    	virtual void send_msg(struct cmd_msg* msg) = 0;
    };
    
    
    uv_session类继承自session类
    class uv_session : session {
    public:
    	uv_tcp_t tcp_handler;
    	char c_address[32];   //client_address
    	int c_port;			 //client_port
    
    	uv_shutdown_t shutdown;
    	bool is_shutdown;
    
    public:
    	//缓冲区保存的数据,如果处理过一个包后,只是相当于把数据地址,移动到缓冲区头部,然后做数据覆盖,
    	//当打印缓冲区的时候,如果现在收到的数据,没有上一次的数据多,就会把这次的数据覆盖在上一次的内存地址,
    	//所以打印的时候会是前面上当前的数据,后面是上一次的数据
    	char recv_buf[RECV_LEN];    
    	
    	int recved;
    	int socket_type;
    
    	char* long_pkg;    //处理一个数据包大于
    	int long_pkg_size;
    
    public:
    	int is_ws_shake;
    
    private:
    	void init();
    	void exit();
    
    public:
    	static uv_session* create();
    	static void destory(uv_session* s);
    
    
    public:
    	virtual void close();
    	virtual void send_data(unsigned char* body, int len);
    	virtual const char* get_address(int* c_port);
    	virtual void send_msg(struct cmd_msg* msg);
    
    
    };

    tcp_handler:每一个session对应一个libuv链接句柄,保存在session管理中

    c_address:IP

    c_port:端口

    showdown:每一个session关闭的时候需要一个uv_shutdown_t提前在session缓存区中申请好,防止重复申请释放产生内存碎片

    recv_buf:用户收到的数据放在这个内存地址中

    recved:用户收到了多少数据

    socket_type:用户socket连接模式

    long_pkg:大于recv_buf长度的数据放在这里这里

    long_pkg_size:大数据包的长度

    is_ws_shake:是否已经握手

    2、初始化函数init_session_allocer,init_session_allocer函数在系统启动的时候由netbus模块执行,用来在系统启动时申请好uv_sessionuv_write_twbuf内存缓存区,防止重复申请释放产生内存碎片

    void init_session_allocer(){
    	if (session_allocker == NULL){
    		session_allocker = create_cache_allocer(SESSION_CACHE_CAPACITY, sizeof(uv_session));
    	}
    
    	if (wr_allocer == NULL){
    		wr_allocer = create_cache_allocer(WQ_CACHE_CAPACITY, sizeof(uv_write_t));
    	}
    
    	if (wbuf_allocer == NULL){
    		wbuf_allocer = create_cache_allocer(WBUF_CACHE_CAPACITY, CMD_CACHE_SIZE);
    	}
    }

    3、uv_session::create函数:从session缓存区中申请一个session出来

    uv_session* uv_session::create(){
    	uv_session* uv_s = (uv_session*)cache_alloc(session_allocker, sizeof(uv_session));
    	uv_s->uv_session::uv_session();
    	uv_s->init();
    	return uv_s;
    }

    4、uv_session::destory函数:把内存释放回内存池

    void uv_session::destory(uv_session* s){
    	s->exit();
    	s->uv_session::~uv_session();   //c模仿c++释放类 调用析构函数
    	cache_free(session_allocker, (void*)s);
    }

    5、send_data 和 send_msg函数

    send_data函数:通过这个函数把数据发送给客户端

    void uv_session::send_data(unsigned char* body, int len){
    	uv_write_t* w_req = (uv_write_t*)cache_alloc(wr_allocer, sizeof(uv_write_t));
    	uv_buf_t w_buf;
    
    
    	if (this->socket_type == WS_SOCKET){
    		if (this->is_ws_shake){
    			int ws_pkg_len = 0;
    			unsigned char* ws_pkg = ws_protocol::package_ws_send_data(body, len, &ws_pkg_len);
    
    			w_buf = uv_buf_init((char*)ws_pkg, ws_pkg_len);
    			uv_write(w_req, (uv_stream_t*)&this->tcp_handler, &w_buf, 1, after_write);
    
    			ws_protocol::free_package_data(ws_pkg);
    		}
    		else{
    			w_buf = uv_buf_init((char*)body, len);
    			uv_write(w_req, (uv_stream_t*)&this->tcp_handler, &w_buf, 1, after_write);
    		}
    	}
    	else{ //tcp
    		int tp_pkg_len = 0;
    		unsigned char* tp_pkg = tcp_protocol::package(body, len, &tp_pkg_len);
    		w_buf = uv_buf_init((char*)tp_pkg, tp_pkg_len);
    		uv_write(w_req, (uv_stream_t*)&this->tcp_handler, &w_buf, 1, after_write);
    
    		tcp_protocol::release_package(tp_pkg);
    	}
    }

    send_msg函数:把数据通过proto_man编码后传给send_data发送

    void uv_session::send_msg(struct cmd_msg* msg){
    	unsigned char* encode_pkg = NULL;
    	int encode_len = 0;
    	encode_pkg = proto_man::encode_msg_to_raw(msg, &encode_len);
    	if (encode_pkg){
    		this->send_data(encode_pkg, encode_len);
    		proto_man::msg_raw_free(encode_pkg);
    	}
    }

     

    展开全文
  • 上文中在Tomcat的context.xml中配置了Session管理器RedisSessionManager,实现了通过redis来存储session的功能;Tomcat本身提供了多种Session管理器,如下类图: 1.Manager接口类 定义了用来管理session的基本...
  • 微服务架构下的分布式Session管理

    千人学习 2016-12-19 15:17:23
    Session一直以来都是Web应用中不可或缺的一个组成部分,在Web应用架构的变迁与演进过程中,Session管理也在随之改变,不同架构下有着不同的Session管理实现。 而时下热门的微服务架构又会为Session管理带来哪些改变...
  • shiro-会话管理(session管理

    千次阅读 2019-03-22 21:02:05
    shiro-会话管理(session管理) shiro自己实现了一套session管理体系可以在不借助任何web容器或servlet的情况下使用session。 1.SessionManager(session管理器)、SessionDAO(实现session的增删改查) 2.Redis实现...

    shiro-会话管理(session管理)

    shiro自己实现了一套session管理体系可以在不借助任何web容器或servlet的情况下使用session。
    1.SessionManager(session管理器)、SessionDAO(实现session的增删改查)
    2.Redis实现Session共享
    3.Redis实现Session共享存在的问题
    代码:
    pom.xml文件中添加依赖

        <dependency>
                    <groupId>redis.client</groupId>
                    <artifactId>jedis</artifactId>
                    <version>2.8.0</version>
        </dependency>
    

    通过jedis来实现session共享主要是重写他的一些增删改查方法,主要是通过重写AbstractSessionDAO的一些方法,我们新建自己的dao,新建session.RedisSessionDao.java。

    package com.imooc.session;
    
    import com.imooc.Util.JedisUtil;
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.session.Session;
    import org.apache.shiro.session.UnknownSessionException;
    import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
    import org.apache.shiro.util.CollectionUtils;
    import org.springframework.util.SerializationUtils;
    
    import javax.annotation.Resource;
    import java.io.Serializable;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Set;
    
    public class RedisSessionDao extends AbstractSessionDAO{
    
        @Resource
        private JedisUtil jedisUtil;
    
        private final  String SHIRO_SESSION_PREFIX = "imooc_session";
    
        /*key由sessionid和前缀SHIRO_SESSION_PREFIX组成 二进制方式返回*/
        private byte[] getKey(String key){
            return (SHIRO_SESSION_PREFIX+key).getBytes();
        }
    
        /*保存session*/
        private void saveSession(Session session){
            if (session!=null&&session.getId()!=null){
                byte[] key = getKey(session.getId().toString());
                /*将session序列化*/
                byte[] value = SerializationUtils.serialize(session);
                jedisUtil.set(key,value);
                /*设置超时时间*/
                jedisUtil.expire(key,600);
            }
    
        }
    
        @Override
        protected Serializable doCreate(Session session) {
            /*通过sessionId保存对应的session*/
            Serializable sessionId = generateSessionId(session);
            /*将sessionId和session捆绑*/
            assignSessionId(session,sessionId);
           saveSession(session);
            return sessionId;
        }
    
        /**
         * 通过sessionId获得session
         * @param sessionId
         * @return
         */
        @Override
        protected Session doReadSession(Serializable sessionId) {
            if (sessionId==null){
                return null;
            }
            byte[] key = getKey(sessionId.toString());
            byte[] value = jedisUtil.get(key);
            //将值反序列化为session对象
            return (Session) SerializationUtils.deserialize(value);
        }
    
        public void update(Session session) throws UnknownSessionException {
           saveSession(session);
    
        }
    
        public void delete(Session session) {
    
            if(session==null||session.getId()==null){
                return;
            }
            byte[] key = getKey(session.getId().toString());
            jedisUtil.del(key);
        }
    
        /*获得指定的存活的session*/
        public Collection<Session> getActiveSessions() {
            /*通过前缀获得相关的所有的key*/
            Set<byte[]> keys = jedisUtil.getKeys(SHIRO_SESSION_PREFIX);
            Set<Session> sessions = new HashSet<Session>();
            if (CollectionUtils.isEmpty(keys)){
                return sessions;
            }
            for(byte[] key: keys){
                //反序列化为session对象
                Session session = (Session) SerializationUtils.deserialize(jedisUtil.get(key));
                sessions.add(session);
            }
    
            return sessions;
        }
    }
    
    

    创建一个Redis访问的工具包,新建utils.JedisUtil.java

    package com.imooc.Util;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    
    import javax.annotation.Resource;
    import java.util.Set;
    
    
    /**
     * 写Jedis操作的一些方法
     */
    @Component
    public class JedisUtil {
    
        /**
         * JedisPool连接池,用于获取连接
         */
       @Autowired
       private JedisPool jedisPool;
    
        private Jedis getResources(){
            return jedisPool.getResource();
        }
    
    
        public byte[] set(byte[] key, byte[] value) {
    
            Jedis jedis = jedisPool.getResource();
            try{
                jedis.set(key,value);
                return value;
            }finally {
                jedis.close();
            }
    
        }
    
        /*设置指定key的超时时间,单位为s*/
        public void expire(byte[] key, int i) {
            Jedis jedis = jedisPool.getResource();
            try{
                jedis.expire(key,i);
            }finally {
                jedis.close();
            }
        }
    
        public byte[] get(byte[] key) {
            Jedis jedis = jedisPool.getResource();
            try{
                return jedis.get(key);
            }finally {
                jedis.close();
            }
        }
    
        public void del(byte[] key) {
            Jedis jedis = jedisPool.getResource();
            try{
                jedis.del(key);
            }finally {
                jedis.close();
            }
        }
    
        public Set<byte[]> getKeys(String shiro_session_prefix) {
            Jedis jedis = jedisPool.getResource();
            try{
                return jedis.keys((shiro_session_prefix+"*").getBytes());
            }finally {
                jedis.close();
            }
        }
    }
    
    ```创建Redis相关的spring文件,通过构造器的方式来创建。
    spring-redis.xml
    ```xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean class="redis.clients.jedis.JedisPool" id="JedisPool">
            <constructor-arg ref="JedisPoolConfig"/>
            <constructor-arg value="127.0.0.1"/>
            <constructor-arg value="6379"/>
        </bean>
    
        <bean class="redis.clients.jedis.JedisPoolConfig" id="JedisPoolConfig"/>
    
    </beans>
    

    这样我们的JedisPool就创建成功了,我们在JedisUtils里引入。
    在spring.xml文件里引入spring-redis.xml。

    <import resource="spring-redis.xml"/>
    

    将JedisUtil注入RedisSessionDao中,

    @Resource
        private JedisUtil jedisUtil;
    

    小记:注入就是spring的管理机制bean工厂已经把对象及其属性创建好,只需要程序员去调用。关于spring注入的方式,引用一下一位大佬的博客。https://blog.csdn.net/a909301740/article/details/78379720

    RedisSessionDao重写AbstractSessionDao的详细方法我们卸载JedisUtils里。
    ++++++我是分割线----进入第二部分啦+++
    在spring.xml里配置sessionManager

    <bean class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager" id="sessionManager">
            <property name="sessionDAO" ref="redisSessionDao"/>
        </bean>
    
        <bean class="com.imooc.session.RedisSessionDao" id="redisSessionDao"/>
    

    在securityManager中加入sessionManager属性

    <property name="sessionManager" ref="sessionManager"/>
    

    因为DefaultWebSessionManager会重复多次读取session浪费资源,所以我们重写一下DefaultWebSessionManager的retrieveSession方法
    CustomSessionManager.java

    package com.imooc.session;
    
    import com.sun.xml.internal.ws.developer.Serialization;
    import org.apache.shiro.session.Session;
    import org.apache.shiro.session.UnknownSessionException;
    import org.apache.shiro.session.mgt.SessionKey;
    import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
    import org.apache.shiro.web.session.mgt.WebSessionKey;
    import org.apache.shiro.web.session.mgt.WebSessionManager;
    import org.omg.CORBA.ServerRequest;
    
    import javax.servlet.ServletRequest;
    import java.io.Serializable;
    
    public class CustomSessionManager extends DefaultWebSessionManager{
    
        @Override
        protected Session retrieveSession(SessionKey sessionKey) throws UnknownSessionException {
            Serializable sessionId = getSessionId(sessionKey);
            ServletRequest request = null;
            if (sessionKey instanceof WebSessionKey){
                request = (ServletRequest) ((WebSessionKey) sessionKey).getServletRequest();
            }
            if (request!=null&&sessionId!=null) {
                Session session = (Session) request.getAttribute(sessionId.toString());
                if(session!=null)
                {
                    return session;
                }
            }
           Session session = super.retrieveSession(sessionKey);
            if(request!=null &&sessionId!=null){
                request.setAttribute(sessionId.toString(),session);
            }
            return session;
        }
    }
    
    
    展开全文
  • shiro教程:session管理

    千次阅读 2018-07-23 16:28:57
    当我们项目需要进行session管理的时候,我们就需要进行相关的配置了,下面讲一下步骤 1、配置文件配置 首先我们需要对sessionManager进行相关的配置。 &lt;!-- 会话管理器 start --&gt; &lt;bean...

    当我们项目需要进行session管理的时候,我们就需要进行相关的配置了,下面讲一下步骤

    1、配置文件配置

    首先我们需要对sessionManager进行相关的配置。

     <!-- 会话管理器 start -->
    	<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
    		<!-- session的失效时长,单位毫秒 1小时: 3600000, itzixi站点设置以 6小时 为主:21600000 -->
    		<!-- 设置全局会话超时时间,默认30分钟,即如果30分钟内没有访问会话将过期 1800000 -->
    	    <property name="globalSessionTimeout" value="21600000"/>
    	    <!-- 删除失效的session -->
    	    <property name="deleteInvalidSessions" value="true"/>
    	    <!-- 是否开启会话验证器,默认是开启的 -->
    	    <property name="sessionValidationSchedulerEnabled" value="true"/>
    	    <!-- 
    	    	Shiro提供了会话验证调度器,用于定期的验证会话是否已过期,如果过期将停止会话;
    	    	出于性能考虑,一般情况下都是获取会话时来验证会话是否过期并停止会话的;
    	    	但是如在web环境中,如果用户不主动退出是不知道会话是否过期的,因此需要定期的检测会话是否过期,
    	    	Shiro提供了会话验证调度器SessionValidationScheduler来做这件事情。
    	     -->
    	    <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> 
    	    <!-- Shiro提供SessionDAO用于会话的CRUD -->
    	    <property name="sessionDAO" ref="sessionDAO"/>
    	    <!-- 
    	    	是否启用/禁用Session Id Cookie,默认是启用的;
    	    	如果禁用后将不会设置Session Id Cookie,即默认使用了Servlet容器的JSESSIONID,
    	    	且通过URL重写(URL中的“;JSESSIONID=id”部分)保存Session Id。 
    	    -->
    	    <property name="sessionIdCookieEnabled" value="true"/>
    	    <property name="sessionIdCookie" ref="sessionIdCookie"/>
    	</bean>
    
    	<!-- 会话验证调度器 -->
    	<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
    		<!-- 设置调度时间间隔,单位毫秒,默认就是1小时,  半小时:1800000 -->
    	    <property name="interval" value="3600000"/>
    	    <!-- 设置会话验证调度器进行会话验证时的会话管理器 -->
    	    <property name="sessionManager" ref="sessionManager"/>
    	</bean>
    

    2、securityManager安全管理器配置

    将sessionManager加入到安全管理器中

     <!-- 安全管理器 -->
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        	
        	<!-- 配置sessionManager,提供session管理 -->
        	<property name="sessionManager" ref="sessionManager"></property>
       
        </bean>
    
    展开全文
  • 自定义Session管理

    千次阅读 2017-06-23 09:37:42
    1.使用HttpSessionContext可以管理HttpSession,但在使用过程中获取不到session, 在API中查到 “从Java(TM)Servlet API的2.1出于安全原因,没有更换。这个接口将在API的未来版本中被...自定义session管理器代码pac

    1.使用HttpSessionContext可以管理HttpSession,但在使用过程中获取不到session, 在API中查到

    “从Java(TM)Servlet API的2.1出于安全原因,没有更换。这个接口将在API的未来版本中被删除。”

    2.自定义HttpSession资源管理器

    自定义的session资源管理器需要和session监听器配合使用

    3.自定义session管理器代码

    package com.wqd.common.app.util;
    import java.util.HashMap;
    import java.util.Map;
    import javax.servlet.http.HttpSession;
    public class SessionContext {
    public static SessionContext sessionContext;
    public static Map<String,HttpSession> map;
    public SessionContext(){
    map = new HashMap<String, HttpSession>();
    }
    /**
    * 获取session管理器
    * @return
    */
    public static SessionContext getInstance(){
    if(sessionContext==null){
    sessionContext = new SessionContext();
    }
    return sessionContext;
    }

    /**
    * 添加session
    * @param session
    */
    public synchronized void addSession(HttpSession session){
    map.put(session.getId(), session);
    }

    /**
    * 获取session
    * @param sessionId
    * @return
    */
    public synchronized HttpSession getSession(String sessionId){
    return map.get(sessionId);
    }

    /**
    * 移除session
    * @param sessionId
    */
    public synchronized void removeSession(String sessionId){
    map.remove(sessionId);
    }
    }



    展开全文
  • 原文:... Spring Session是如何运行的 我们已经讨论了在传统的应用服务器中,HTTP session管理存在不足的各种场景,接下来看一下Spring Session是如何解决这些问题的。 Sprin
  • 应用服务器集群的session管理:这是我在一本网站技术架构分析的书上看到的。这一章主要写在高可用架构设计之下服务无状态这一特性下怎么管理会话(session)。以下是几例解决方案(示例图为转载图片): 1....
  • shiro+redis做session管理

    2014-11-20 11:29:32
    shiro+redis做session管理,简单demo。
  • 6.Spring Security Session 管理

    千次阅读 2019-11-05 13:54:38
    Spring Security Session 管理 用户登录成功后,信息保存在服务器 Session 中,这节学习下如何管理这些 Session。这节将在 Spring Security 短信验证码登录的基础上继续扩展。 Session 超时设置 Session 超时时间也...
  • SpringBoot使用SpringSecurity的session管理

    千次阅读 2020-02-17 10:50:01
    文章目录session管理session...session管理 session超时处理 直接在配置文件配置 server: servlet: session: timeout: 10 SpringBoot的默认的session过期时间最少为1分钟。session失效跳转地址,在security配...
  • springsession 所带来session管理的革新

    千次阅读 2016-12-26 09:42:03
    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新。 但是,现代的趋势是微服务以及可水平扩展的原生云应用(cloud...
  • 一、Tomcat相关影响session管理的配置文件 1 . conf/content.xml,默认配置中Manager 注释不打开情况下,重启后后保留session不失效。 Manager 打开情况下,重启后会丢失session &amp;amp;amp;amp;amp;lt;!-- The...
  • Spring Security(13)——session管理

    千次阅读 热门讨论 2017-06-09 08:46:45
    Spring Security通过http元素下的子元素session-management提供了对Http Session管理的支持。 1.1 检测session超时 Spring Security可以在用户使用已经超时的sessionId进行请求时将用户引导到指定的页面。这个...
  • 微服务架构下分布式session管理

    千次阅读 2018-08-08 12:04:47
    一、应用架构变迁下的Session管理 1.1 单体架构 1.2 分布式架构 1.3 微服务架构 二、微服务架构下分布式Session管理 2.1 Session存储介质 2.2 管理方案实现 三、微服务架构下分布式Session管理方案 四、总结...
  • 为了实现多个应用之间session共享,将session管理交由redis来缓存,此时如果往session中存放数据,会不会出现同一份数据分别在内存中两个不同位置存放着,还是只在redis中存取都在redis
  • 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录、身份、权限及状态等信息。对于使用Tomcat作为Web容器的大部分开发...
  • 微服务架构下分布式Session管理

    千次阅读 2016-09-17 22:37:39
    Session管理是Web应用架构中不可或缺的解决方案之一,它为用户进行了状态保持,将原本每次相对独立的浏览器请求联通成一系列的业务操作。随着Web应用架构的不断变迁,对Session管理的需求也随之不同,在当前微服务...
  • 在《Tomcat7.0源码分析——Session管理分析(上)》一文中我介绍了Session、Session管理器,还以StandardManager为例介绍了Session管理器的初始化与启动,本文将接着介绍Session管理的其它内容。
  • 集群环境中的Session管理

    千次阅读 2016-10-14 14:46:33
    一、概述本文首先按照以下顺序讨论集群环境中Session管理的常见手段,然后使用一个实例来展示如何使用Spring Session快速实现集群间Session共享。 使用cookie记录session Session sticky Session sticky + 文件或...
  • tomcat session管理总结

    千次阅读 2013-05-11 15:40:58
    1. Catalina通过一个成为Session管理器的组件来管理建立的Session对象,该组件由org.apache.catalina.Manager接口表示。 2. Session管理器需要与一个Context容器相关联,且必须与一个Context容器关联。 3. ...
  • 提要:本文主要的写作目的是解释集群方案中的一些重要的概念,然后引入另一种session管理机制:基于缓存的session管理。本文并不讲述如何配置apache和tomcat来实现集群和负载均衡,关于这方面内容,可参考我的另一篇...
  • JavaWeb开发中的Session管理

    千次阅读 2017-05-29 18:50:43
    Session管理是Web应用程序开发中一个非常重要的主题,这是因为Web语言HTTP是 无状态的。在默认情况下,Web服务器不知道一个HTTP请求时来自初次用户,还是来自 之前访问过的用户。 例如,webmail应用程序要求用户在...
  • (十二)自定义session管理

    千次阅读 2018-04-26 11:02:36
    easyopen1.4.0开始支持自定义session管理。 创建session 登陆成功后创建session,并返回sessionId // 自定义session @PostMapping("managedSessionLogin") public String managedSessionLogin...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 477,652
精华内容 191,060
关键字:

session管理