log4j

集群部署的落地实现之spring shiro redis 架构 第一篇 shiro通过springcache集成redis缓存

半世苍凉 提交于 2020-08-15 12:40:31
本系列文章针对的是使用shiro框架实现的权限管理系统。这样的系统改成集群模式,主要是把shiro更换为集群模式,让shiro管理的session实现共享。本文介绍的就是借助分布式缓存redis来实现用户会话共享。 shiro的缓存体系分为两种情况,一是使用jvm内存缓存MemorySessionDAO,二是使继承CachingSessionDAO实现里面的抽象方法。本文实现的是集群模式,所以只能使用第二种方式。shiro没有自己实现缓存,但是定义好了缓存模板,只要把自定义的缓存管理器cacheManager注入到shiro配置文件即可。好的,接下来问题就是编写缓存管理器了。 仔细看看文章的标题,我们借助springcache来编写cacheManager,这样就不需要完整编写cacheManager了。只要把这个桥梁给适配好即可。但是缓存管理器管理的缓存对象需要自己去完整编写。 不说了,直接上代码。 import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheException; import org.apache.shiro

OAuth2 Token 一定要放在请求头中吗?

萝らか妹 提交于 2020-08-15 12:29:06
Token 一定要放在请求头中吗? 答案肯定是否定的,本文将从源码的角度来分享一下 spring security oauth2 的解析过程,及其扩展点的应用场景。 Token 解析过程说明 当我们使用 spring security oauth2 时, 一般情况下需要把认证中心申请的 token 放在请求头中请求目标接口,如下图 ① spring security oauth2 通过拦截器获取此 token 完成令牌到当前用户信息(UserDetails)的转换。 OAuth2AuthenticationProcessingFilter.doFilter public class OAuth2AuthenticationProcessingFilter{ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { try { // 1. 根据用户请求解析令牌,组装预登陆对象 Authentication authentication = tokenExtractor.extract(request); if (authentication == null) { // 若是预登陆状态为空,把无状态登录清空

Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar 解决方法

99封情书 提交于 2020-08-14 14:12:48
Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar 解决方法 问题: 导入spark依赖包后,local模式下运行spark本地程序报错: Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details. 这个错运行spark程序比较常见,由于很多maven项目中都依赖了log4j的包,这里需要针对冲突的包执行exclude即可 第一层(exclusion 报错jar 包的log4j即可): 网上最常见的解决方法,也是报错日志官方给出的解决方案 假设我加入了spark core的依赖包: <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.2.1</version> <

图解高内聚与低耦合,傻瓜都能看懂!

喜你入骨 提交于 2020-08-14 12:33:26
作者:大道方圆 来源:www.cnblogs.com/xdecode/p/9393885.html 模块 模块就是从逻辑上将系统分解为更细微的部分, 分而治之, 复杂问题拆解为若干简单问题, 逐个解决. 耦合主要描述模块之间的关系, 内聚主要描述模块内部. 模块的粒度可大可小, 可以是函数, 类, 功能块等等. 耦合 模块之间存在依赖, 导致改动可能会互相影响, 关系越紧密, 耦合越强, 模块独立性越差. 比如模块A直接操作了模块B中数据, 则视为强耦合, 若A只是通过数据与模块B交互, 则视为弱耦合. 独立的模块便于扩展, 维护, 写单元测试, 如果模块之间重重依赖, 会极大降低开发效率. 内聚 模块内部的元素, 关联性越强, 则内聚越高, 模块单一性更强. 一个模块应当尽可能独立完成某个功能, 如果有各种场景需要被引入到当前模块, 代码质量将变得非常脆弱, 这种情况建议拆分为多个模块. 低内聚的模块代码, 不管是维护, 扩展还是重构都相当麻烦, 难以下手. 接口设计原则 好的接口应当满足设计模式六大原则, 很多设计模式, 框架都是基于高内聚低耦合这个出发点的. 单一职责原则: 一个类只负责一个功能领域中的相应职责. 开闭原则: 一个软件实体应当对扩展开放,对修改关闭. 里氏代换原则: 所有引用基类(父类)的地方必须能透明地使用其子类的对象. 依赖倒转原则: 抽象不应该依赖于细节

浅谈常见数据结构和算法的应用系列(一)

痴心易碎 提交于 2020-08-14 07:01:55
近来有小伙伴问我:刷leetcode真的有用吗,觉得收益很小,越刷越迷茫了… 诚然每个人刷题的目的不一样,233酱还不是为了能水几篇文章… 当然不止。我觉得刷题是一件有意思的事,就像小猫小狗咬自己尾巴,玩弄的不亦乐乎。比喻可能不太恰当,是有种沉迷小游戏的感觉。 可是在艰难打野的过程中,我们不要忘了,最重要的是: 了解每种技能包的特点,适合解决的问题和场景。在特定实战场景下能够使用特定的技能包,自创技能包。这才是武功的至高境界。 装X结束,浅谈开始。。 数据结构是指:一种数据组织、管理和存储的格式,它可以帮助我们实现对数据高效的访问和修改。 数据结构 = 数据元素 + 元素之间的结构。 如果说数据结构是造大楼的骨架,算法就是具体的造楼流程。流程不同,效率资源不同。我会两者结合简单探讨下他们的特点和应用。 常见的数据结构可分为: 线性结构、树形结构 和 图状结构 。 常见的算法有: 递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 等。 本文从 线性数据结构、递归 和 排序算法 谈起。 线性结构 线性结构:是指数据排成像一条线一样的结构。每个元素结点最多对应一个前驱结点和一个后继结点。如数组, 链表,栈 ,队列等。 数组 数组是是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用 元素的下标位置

IOC和DI的概念,以及Spring框架的介绍

只愿长相守 提交于 2020-08-14 06:47:30
对于Java开发者来说,Spring肯定是一个避不开的技术。所以准备系统的学下Spring框架。 我给自己设计的学习路线是这样的:首先阅读下Spring的官方文档(注意Spring官网上有很多项目,Spring的基础框架是Spring FrameWork这个项目),记录我认为重要的内容,方便后续回顾;到这边对Spring已经有了基本的认识,然后是找一到两本关于Spring源码的书,深入学习下Spring框架的原理性内容;最后是对于Spring的关键特性单独写博客记录,其实也就是对第二步的记录,你看了源码分析之后会对Spring的实现原理也有些了解。这些东西你不记录的话会很快遗忘。博客是一个很好的记录和分享自己所学的工具。所以后续我会对Spring的启动过程、自动注入、AOP和Spring MVC这些我之前看起来很高级的特性单独写博客记录。 本博客是学习路线的第一步,是对Spring官方文档的记录。主要是熟悉Spring框架有哪些功能,基本的使用方式是怎样的。由于Spring FrameWork的官方文档比较长,所以分模块来记录了,本博客是Spring FrameWork核心技术部分的记录,基于5.2.6版本.关于这个版本相对于之前版本的 更新 ,请点击连接查看。 简介 Spring是一个轻量级的Java Bean容器,这个容器为应用程序的开发提供了基础框架(基础功能)的支持

Java路径问题最终解决方案

懵懂的女人 提交于 2020-08-13 17:15:52
前言 Java的路径问题,非常难搞。最近的工作涉及到创建和读取文件的工作,这里我就给大家彻底得解决Java路径问题。 我编写了一个方法,比ClassLoader.getResource(String 相对路径)方法的能力更强。它可以接受“../”这样的参数,允许我们用相对路径来定位classpath外面的资源。这样,我们就可以使用相对于classpath的路径,定位所有位置的资源! Java路径 Java中使用的路径,分为两种:绝对路径和相对路径。具体而言,又分为四种: 一、URI形式的绝对资源路径 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b URL是URI的特例。URL的前缀/协议,必须是Java认识的。URL可以打开资源,而URI则不行。 URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可! 二、本地系统的绝对路径 D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b Java.io包中的类,需要使用这种形式的参数。 但是,它们一般也提供了URI类型的参数,而URI类型的参数,接受的是URI样式的String。因此,通过URI转换,还是可以把URI样式的绝对路径用在java.io包中的类中。 三、相对于classpath的相对路径 如

入门MyBatis框架你一点都不需要慌

筅森魡賤 提交于 2020-08-13 01:03:02
MyBatis 项目已托管到 GitHub ,大家可以去GitHub查看下载!并搜索关注微信公众号 码出Offer 领取各种学习资料! 一、框架概述 1.1 什么是框架? 软件的半成品,解决了软件开发过程当中的普适性问题,从而简化了开发步骤,提供了开发的效率 1.2 什么是ORM框架? ORM(Object Relational Mapping)对象关系映射,将程序中的一个对象与表中的一行数据一一对应 ORM框架提供了持久化类与表的映射关系,在运行时参照映射文件的信息,把对象持久化到数据库中 1.3 使用JDBC完成ORM的缺点 存在大量的冗余代码 手工创建 Connection、Statement 等 手工将结果集封装成实体对象 查询效率低,没有对数据访问进行过优化(Not Cache) 二、MyBatis概述 2.1 什么是MyBatis MyBatis本是Apache软件基金会的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了Google Code,并且改名为MyBatis。2013年11月迁移到Github。MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML

IDEA tomcat容器和log4j日志中文乱码的终极解决方案

泪湿孤枕 提交于 2020-08-12 18:08:03
一、Tomcat容器下Conf文件夹 如果是GBK改为UTF-8 java.util.logging.ConsoleHandler.encoding = UTF-8 logging.properties <Connector port="8080" protocol="HTTP/1.1" connectionTimeout ="20000" redirectPort ="8443" URIEncoding="UTF-8"/> <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" /> server.xml 二、网上很多说的改 IDEA安装目录bin下的idea.exe.vmoptions,idea64.exe.vmoptions两个文件,末尾加入 -Dfile.encoding=UTF-8 - Xms128m - Xmx750m -XX:ReservedCodeCacheSize= 240m -XX:+ UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 - ea -XX:CICompilerCount=2 -Dsun.io