当前位置: 首页 > news >正文

做旅游网站的目的和意义购物网站排名榜

做旅游网站的目的和意义,购物网站排名榜,无锡高端网站建设公司哪家好,邯郸做网站服务商引言 开篇时说些题外话#xff0c;最近刚刚被公司CY#xff0c;不过很快找到了下家#xff0c;也同时拿到了三家公司的Offer。一周面试下来#xff0c;总体感觉面试题少了#xff0c;不过多了上机程序题。新公司是做外包#xff0c;不过相比于上一家公司#xff0c;也算…引言 开篇时说些题外话最近刚刚被公司CY不过很快找到了下家也同时拿到了三家公司的Offer。一周面试下来总体感觉面试题少了不过多了上机程序题。新公司是做外包不过相比于上一家公司也算是因祸得福有新的东西学习也有更多的工作等待我去完成比较于之前的闲的蛋疼和打杂的活对我的个人技术磨炼应该是有百利而无一害。所以非常庆幸公司把我CY。 刚入职的第三天开通Git账号的第二天临时分配的渗透测试漏洞修复总共有四个漏洞修复分别是 1、管理员快速冻结普通用户session 实时注销 - 《Web应用安全————账号冻结与 Session 实时失效》 2、会话固定漏洞 - 《Web应用安全————Shiro 解决会话固定漏洞》 3、多点登录互斥 - 《Web应用安全————多点登录互斥》 4、暴力破解开启验证码 其中第一条算是比较常见的web安全功能第二条不太常见但是非常重要也是解决起来最困难的一个我前后花了整整两天的时间才总算解决这个问题由于这个问题掺杂了一些Shiro 框架的知识我会在下一篇文章中仔细阐述一下这个问题的解决思路和我都遇到了哪些疑惑以及是如何思考和解决的。 第三条是一个session 互斥操作其实也是比较简单的而第四条暴力破解漏洞通常只要开启一个验证码就可以解决了。 本篇文章讨论第一条管理员如何在冻结普通用户的同时使其Session 注销掉。 一、注销用户 session 的解决思路 处理掉他人session 的最核心思路就是 1、明确当前使用的安全框架或没有的 session 管理的 session 失效API 是什么。 2、找到要被注销的 session  的 session id。 3、冻结或删除用户后通过 session id找到其对应的session 对象并立刻调用 session 失效 API 方法。 简单来说就是 先找到 session id 然后再找到 session 最后在冻结用户或者删除用户的时候立刻调用使 session 失效的方法。 二、确定 Session 失效的方法 我们以往在处理Web应用的Session时会使用HttpSession对象它是javax.servlet.api中的底层接口。而我的项目使用的是Shiro 安全管理框架又有自己的 Session 接口org.apache.shiro.session.Session。 不过我想说的是对于处理 Session 失效的问题其实无关框架只要是处理会话操作无非就是几个获取 session id、存取session 中的属性、设置/获取超时时间、获取最后访问时间、以及和我们本篇相关的 使Session 失效 等等。 在HttpSession对象中我们使用 void invalidate(); 方法 来使 Session 失效。那么同样的在 Shiro 中也有类似的方法只不过换了个葫芦void stop(); 所以不论是使用哪种安全框架 什么 Shiro、Spring Security甚至是原始接口都可以找到对应的 Session 失效的方法。 明确了如何让Session 失效那么接下来就是如何确定用户的 session id。 三、管理员清理用户 session 的实现 在 Shiro 中session的创建是通过org.apache.shiro.session.mgt.DefaultSessionManager.doCreateSession(SessionContext)它先是 new SimpleSession(host); 创建了一个Session 对象然后再通过 this.sessionDAO.create(session) 创建了 session id 并将 session 一同 放入一个 MapCacheK, V 中。 MapCacheK, V 这是一个值是 session 对象键是 session id 的 Map对象。 3.1 自定义 session id 池 对于指定用户要想获得他的session id 恐怕没什么好的途径。那么我们可以利用Map 来自行维护一个 用户与其 Session id 的唯一对应关系但值得注意的是必须要考虑多个管理员同时操作同一个用户的情况因此就必须做线程安全处理并且要全局唯一。 我们可以创建一个类来专门维护用户的 Account和 session id的对应关系类 /*** * session id 管理池方便超级管理员获取普通用户的session id并及时注销。 临时解决方案* * author mouhaotian* date 2019/09/12*/ public class CcShiroSessionIdPoolVo {/** this Object */private volatile static CcShiroSessionIdPoolVo sessionIdPoolVo;private volatile MapString, ShiroSessionKey sessionIdPool;private CcShiroSessionIdPoolVo() {this.sessionIdPool new ConcurrentHashMap();}/*** 获取vo对象,双重检查* * return*/public static CcShiroSessionIdPoolVo getInstance() {if (sessionIdPoolVo null) {synchronized (CcShiroSessionIdPoolVo.class) {if (sessionIdPoolVo null) {sessionIdPoolVo new CcShiroSessionIdPoolVo();}}}return sessionIdPoolVo;}/*** 通过账号信息获取用户的sessionid并直接从pool中销毁* * param account* return*/public synchronized ShiroSessionKey getAndDestroySessionId(String account) {return deleteSessionId(account);}public void putSessionId(String account, ShiroSessionKey sessionId) {sessionIdPool.put(account, sessionId);}private ShiroSessionKey deleteSessionId(String account) {return sessionIdPool.remove(account);}public String getKey(Session session) {String sessionId session.getId().toString();for (String acc : sessionIdPool.keySet()) {if (sessionId.equals(sessionIdPool.get(acc).toString()))return acc;}return null;}} CcShiroSessionIdPoolVo 类是一个单例类这是为了可以通过其内置的ConcurrentHaspMap 管理所有登录用户的 session id。 使用ConcurrentHashMap是为了能够在大量用户登录并存储 session id 的时候能够有一个比较不错的并发性。提供的方法并不多主要就是存入和取出而取出方法getAndDestroySessionId() 也只是为了配合冻结账号的功能在取出的时候直接从map 中移除。 注意自行维护账号和 session id 的关键是要与 系统内部的 session 管理的生命周期保持一致换句话说当我们系统的session 没有创建就不能在我们自行维护的map 中插入数据而当系统中用户的 session 过期或者主动注销的时候就必须要同步将我们map 中对应的session id 也移除一般情况下如果是手动注销 session 那么我们可以控制这个流程并一同删除 session id但如果是系统自动过期如何处理呢这个时候我们就可以利用 session 发布的事件用监听的方式来检测session 的过期事件并移除对应的 session id。 另外id 容器的单例实现也是需要考虑的重要课题必须要考虑性能问题。 3.2 Session id 池处理器 创建好了 session id 的容器我们就来创建一个对这个池容器的处理器类 import org.apache.shiro.session.Session; import org.apache.shiro.session.SessionListenerAdapter; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;Service public class ShiroSessionProcessor {/** ShiroConfig 中配置的 session 管理器 */AutowiredDefaultWebSessionManager sessionManager;/*** Shiro session 监听器*/public static class ExpiredSessionListener extends SessionListenerAdapter {Overridepublic void onExpiration(Session session) {CcShiroSessionIdPoolVo sessionIdPool CcShiroSessionIdPoolVo.getInstance();// 当监听到清理过期的Session 清理掉CcShiroSessionIdPoolVo中对应的Session idsessionIdPool.getAndDestroySessionId(sessionIdPool.getKey(session));}}/*** 将每个用户的shiro session id放入shiro session池中管理* * author mouhaotian* date 2019年9月12日 下午5:42:15*/public void shiroSessionIdIntoPool() {String currAccount ShiroKit.getUser().getAccount();// CcShiroSessionIdPoolVo单例全局唯一且线程安全CcShiroSessionIdPoolVo sessionIdPool CcShiroSessionIdPoolVo.getInstance();// 用户浏览器关闭后或有其他人在异端登录旧的失效的 session 依然存在需要手动注销ShiroSessionKey invaliSessionId sessionIdPool.getAndDestroySessionId(currAccount);if (invaliSessionId ! null) {Session invaliSession sessionManager.getSession(invaliSessionId);if (invaliSession ! null) {invaliSession.stop();}}// 刷新当前 shiro sessionShiroKit.getSession().stop();Session newSession ShiroKit.getSession();// 将新的session id 放入管理池中sessionIdPool.putSessionId(currAccount, new ShiroSessionKey(newSession.getId()));}/*** 用户登出后需要手动清理自定义维护的Session id* * author mouhaotian* date 2019年9月15日 下午8:39:10*/public void clearSessionId(ShiroUser subject) {CcShiroSessionIdPoolVo.getInstance().getAndDestroySessionId(subject.getAccount());}} 这个 处理器类只有两个方法最关键 1、shiroSessionIdIntoPool() 2、clearSessionId() 一个负责将 session id 和对应的 用户名 一起存入 刚刚定义的 session id 容器中另一个则是在一些必要的时候手动清理对应的 session id。 说明上面的实现稍显冗余主要是在 sessionid 入池的时候用到了一个 session 刷新的操作这是一个解决会话固定的操作后面会介绍。ExpiredSessionListener 是一个内部类主要负责监听系统的 session 过期事件因为如果用户并没有点击“退出”按钮而是下意识的直接关闭了浏览器那么一般情况下应用程序是收不到任何 注销 session 的请求的这种情况下就会依赖于 session 的超时时间自动进行注销操作我们的ExpiredSessionListener 就是负责监听“过期事件” 并即时处理掉 池中的 session id 与系统的 session 状态保持一致。 3.2 在冻结或删除用户的同时使 session 失效 到了这一步我们已经完成了 用户登录时将用户名与 session id 保存起来的操作有了这个 session id 池我们就可以在删除用户或者是冻结用户的时候通过 用户名直接在 池中 查找对应的 session id 并注销。 AutowiredDefaultWebSessionManager defaultWebSessionManager; /*** 冻结用户前第一时间注销该用户的session* * author mouhaotian* date 2019/09/12*/Before(clearSession())public void freezeUserShiroSession() {Integer userId Integer.valueOf(getRequest().getParameter(userId));// 处理掉该用户的 sessionCcShiroSessionIdPoolVo pool CcShiroSessionIdPoolVo.getInstance();ShiroSessionKey sessionId pool.getAndDestroySessionId(managerDao.selectUser(userId).getAccount());if (sessionId ! null) {// 冻结该用户的sessiondefaultWebSessionManager.getSession(sessionId).stop();}} 这里我使用了 Spring AOP 来切入相应的方法完成注销 session 。或者干脆在删除或冻结的 Service 方法中加入这段逻辑。 简单来说就是先获取 session id 池然后通过 用户的用户名或者是id 具体根据你实际维护的 对应关系 是 用户名 - session id 还是 用户ID - session id来获取池中的 session id。注意一定要判空这是因为如果有两个管理员同时操作的话可能有一个取到的是null 。最后调用 Shiro 的会话管理器的 getSession() 方法并执行 stop()操作。 至于会话管理器不需要追究太深总之任何安全框架肯定都有 getSession(sessionId)  方Shiro 是通过 SessionManager 的Session getSession(SessionKey key) 方法 来获取对应的 session 。如果在 Shiro 配置的JavaConfig 中你是用DefaultWebSessionManager 来作为shiro 的默认会话管理器那么只需要通过Autowired 注解注入到你需要的位置就可以使用 会话管理器对象了。 总结 一般的Web 安全框架都集成了会话管理机制这是一个最基本的功能需求。 一般的 session 管理都没有太好的获取非当前用户 Session 的API 接口因此我们可以考虑自行定义一个 Map 对象来维护每个用户 和其 session id 的对应管理。 在用户登录成功后我们将 用户名或用户id与其对应的 session id 存入 map 中在用户登出或 系统 session 自动超时的时候将其清理出 map。这些自动的操作一定要与系统的 session 状态保持一致以免造成不必要的内存消耗。 在管理员进行手动冻结用户或删除用户的时候可以通过 Spring AOP来统一管理切面统一执行注销 session 的操作。具体做法就是通过 map 中的用户与 session id 的对应关系按照 用户名——session id —— session —— 注销 的流程完成指定用户的注销操作。 注意在实现 map 的时候要考虑单例和 线程安全的问题。在插入、移除操作的时候要考虑性能问题。
http://www.zqtcl.cn/news/666925/

相关文章:

  • 山东省职业能力建设处网站dz论坛怎么做视频网站吗
  • 郑州专业做网站的公司今天郑州最新通告
  • wap网站引导页特效wordpress 文章 数据库
  • 做建筑效果图最好的网站做网站是如果盈利的
  • 企业网站seo托管怎么做seo公司培训
  • 自己做网站不想买空间 自己电脑可以做服务器吗?下载建设网站软件
  • 有服务器自己怎么做网站百度广告电话号码是多少
  • 一个网站 两个数据库沈阳市住房和城乡建设厅网站
  • 重庆建站网站流程及费用制作网页界面工具
  • 设计师家园官网wordpress 4.9 优化
  • 主机屋空间安装织梦后台程序后怎么弄成淘宝客网站襄阳网站制作
  • 怎么建设分销模式手机网站宜昌做网站的公司
  • 网上商城网站设计网页设计作业欣赏
  • 育才网站建设网站访问慢原因
  • 网站建设方案 备案品牌网站推广软件
  • 桓台县建设局网站前端开发入门培训
  • 前端怎么在猪八戒网站接单做烟台网站开发技术
  • 济南烨铭网站建设做英文网站2014
  • 哪个餐饮店微网站做的有特色3d动画制作收费标准
  • h5旅游网站开发wordpress的站点地址如何配置
  • 网站正在维护中 模板招远网站建设
  • 福田欧曼银河报价seo文章是什么
  • 古云网站建设模具培训网站建设
  • 帮助企业做网站的销售卫浴洁具公司网站模板
  • 解释seo网站推广网站域名和空间费用
  • 深圳市珠宝网站建设手机网站框架
  • 晋城推广型网站开发dw做网站模板
  • 万网一个ip建立多个网站网页设计注册页面代码
  • 网站建设6000元地方门户网站有哪些
  • 十大SEO网站外链建设误区排版设计教程入门初学者