当前位置: 首页 > 后端技术 > Java

春季会议的原则

时间:2023-04-02 01:01:39 Java

原文地址:SpringSession原理欢迎访问我的博客:https://blog.duhbb.com介绍今天在写一个对外接口。该接口的大致原理是在filter中通过token获取用户信息,然后创建session。后续流程是Controller->Service->Dao。这种发展不像以前那么愚蠢。我想过这个问题。对方调用时,没有sessionid,即每次认证后都会创建一个session。那么这就可能存在很大的问题,假设调用次数非常多,就会创建很多会话,可能会破坏系统。所以我研究了如何在我们的系统中使用会话。SpringSession探索代码跟踪首先要做的最重要的是断点请求获取session代码。确实有这个说法!request.getSession()file@SuppressWarnings("deprecation")@Order(SessionRepositoryFilter.DEFAULT_ORDER)publicclassSessionRepositoryFilterextendsOncePerRequestFilter{公共静态最终字符串SESSION_REPOSITORY_ATTR=SessionRepository.class.getName();publicstaticfinalintDEFAULT_ORDER=Integer.MIN_VALUE+50;私人最终SessionRepositorysessionRepository;私有ServletContextservletContext;privateMultiHttpSessionStrategyhttpSessionStrategy=newCookieHttpSessionStrategy();filepublicvoidsetAttribute(Stringname,Objectvalue){//比较讲究,设置attr之前checkStatecheckState();session.setAttribute(name,value);}checkState()也很简单,就是检查invalidated是否为true。privatevoidcheckState(){if(invalidated){thrownewIllegalStateException("HttpSession已经失效。");}}从代码中有点难找,不过还是找到了:filefilefileverifiesthedatainredis一个debugsession的key是:spring:session:sessions:62359810-d2cb-4378-a619-e2c31bb8242c,貌似存储哈希结构。在redis中获取hash的命令是:HGETALLhkeyexecuteit:127.0.0.1:6379>HGETALLspring:session:sessions:62359810-d2cb-4378-a619-e2c31bb8242c1)"maxInactiveInterval"2)"\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x01Q\x80"3)"lastAccessedTime"4)"\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01\x82\x00:\x99\x0e"5)"creationTime"6)"\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01\x82\x00:\x99\x0e"好像没有业务数据,哈哈,发现自己白痴了,断点还没放,redis根本就没有存储这条业务数据,再执行:127.0.0.1:6379>HGETALLspring:session:sessions:62359810-d2cb-4378-a619-e2c31bb8242c1)"creationTime"2)"\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01\x82\x00:\x99\x0e"3)"lastAccessedTime"4)"\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01\x82\x00D\x1f["5)"sessionAttr:HumanSession"6)"\xac\xed\x00\x05sr\x00#cn.com.xxx.base.bean.HumanSession\x8f\xbb\xb6d\xf6\x04\x8a\xd5\x02\x00\x1fD\x00\x0b坐标XD\x00\x0b坐标YZ\x00\tvalidFlagL\x00\x0fautoReceiveFlagt\x00\x13Ljava/lang/Integer;L\x00\x0ebrowserVersiont\x00\x12Ljava/lang/String;L\x00\ndataUnitIDqx00~\x00\x01L\x00\afromCasq\x00~\x00\x01L\x00\tfromTokenq\x00~\x00\x01L\x00\thumanCodeq\x00~\x00\x02L\x00\ahumanIDq\x00~\x00\x01L\x00\thumanNameq\x00~\x00\x02L\x00\nhumanStyleq\x00~\x00\x02L\x00\ninvalidMsgq\x00~\x00\x02L\x00\x02ipq\x00~\x00\x02L\x00\rleaderLevelIDq\x00~\x00\x01L\x00\x05logIDq\x00~\x00\x01L\x00\tosVersionq\x00~\x00\x02L\x00\npatrolFlagq\x00~\x00\x01L\x00\bportraitq\x00~\x00\x02L\x00\bproxyUrlq\x00~\x00\x02L\x00\nregionCodeq\x00~\x00\x02L\x00\bregionIDq\x00~\x00\x01L\x00\nregionNameq\x00~\x00\x02L\x00\nregionTypeq\x00~\x00\x01L\x00\bserverIpq\x00~\x00\x02L\x00\x06targetq\x00~\x00\x02L\x00\ttelMobileq\x00~\x00\x02L\x00\aunionIDq\x00~\x00\x01L\x00\x06unitIDq\x00~\x00\x01L\x00\bunitNameq\x00~\x00\x02L\x00\buserNameq\x00~\x00\x02xp\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01pppsr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\x00q\x00~\x00\x06t\x00\rwizdom:100433sq\x00~\x00\x04\x00\x01\x88Qt\x00\x05xxxxx\x00\bdarkbluept\x00\x0f192.168.213.161pppq\x00~\x00\x06t\x00\x00ppq\x00~\x00\x06psq\x00~\x00\x04\x00\x00\x00\x01t\x00\t127.0.0.1pt\x00\x0b17700000000sq\x00~\x00\x04\x00\x00\x02\xbesq\x00~\x00\x04\x00\x00\x00\x02t\x00\x0f\xe5\xb8\x82\xe7\x9b\x91\xe7\x9d\xa3\xe4\xb8\xad\xe5\xbf\x83t\x00\x05xxx"7)"maxInactiveInterval"8)"\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x01Q\x80"9)"sessionAttr:UnionAuthToken"10)"\xac\xed\x00\x05t\x00$125ba47c-fe01-42b6-b5a2-8a87eb266ddc"这个时候多了很多怎么设置过期time什么?其实可以加个过滤器,照常设置session的过期时间即可:JavaWeb对session进行了一层封装,写业务的时候接口不变,但是底层存储已经从Tomcat中的内存变成了Redis,用户还没有感知到,如果可以使用sentinel模式保证Redis的高性能,我感觉是不是解决了分布式Session的问题。*/);session.invalidate();}看来session.invalidate()主要在这里//org.springframework.session.web.http.SessionRepositoryFilter.SessionRepositoryRequestWrapper.//HttpSessionWrapper#invalidatepublicvoidinvalidate(){checkState();this.invalidated=true;requestedSessionInvalidated=true;设置当前会话(空);sessionRepository.delete(获取id());}根据id删除session://org.springframework.session.data.redis.RedisOperationsSessionRepository#deletepublicvoiddelete(StringsessionId){ExpiringSessionsession=getSession(sessionId,true);如果(会话==空){返回;}字符串键=getKey(sessionId);expirationPolicy.onDelete(session);//始终删除它们的键,因为如果刚刚过期,session可能为nullthis.sessionRedisOperations.delete(key);}onDelete也会删除数据:StringexpireKey=getExpirationKey(toExpire);expirationRedisOperations.boundSetOps(expireKey).remove(session.getId());回到我的问题。第三方通过token调用接口创建session非常简单。调用后,会话可以失效。哈哈原文地址:SpringSession原理欢迎访问我的博客:https://blog.duhbb.com