鉴权模块-shiro过滤器与案例分析

ShiroFilter的实现原理:

Shiro对servlet容器的FilterChain进行了代理,在执行Servlet容器的Filter链之前,通过ProxiedFilterChain对Servlet容器的Filter链进行了代理,先执行Shiro自己的Filter体系,然后才会委托给Servlet容器的Filter链进行Servlet容器级别的过滤。

在应用启动阶段,shiro会初始化一些对象:

创建一个PathMatchingFilterChainResolver对象用来解析请求的url匹配到哪个Filter,方式是将url逐一的与Filter的url模式进行匹配,直到匹配到正确的filter,就生成ProxiedFilterChain

1
2
3
4
public PathMatchingFilterChainResolver() {
this.pathMatcher = new AntPathMatcher();
this.filterChainManager = new DefaultFilterChainManager();
}

查看更多

鉴权模块-密码的散列存储

在涉及到密码存储问题上,应该加密 / 生成密码摘要存储,而不是存储明文密码。比如之前的 600w csdn 账号泄露对用户可能造成很大损失,因此应加密 / 生成不可逆的摘要方式存储。

散列算法

散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如 MD5、SHA 等。一般进行散列时最好提供一个 salt(盐)

比如加密密码 “admin”,产生的散列值是 “21232f297a57a5a743894a0e4a801fc3”,可以到一些 md5 解密网站很容易的通过散列值得到密码 “admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和 ID(即盐);这样散列的对象是 “密码 + 用户名 +ID”,这样生成的散列值相对来说更难破解。

Shiro 还提供了通用的散列支持:

1
2
3
4
String str = "hello";
String salt = "123";
//内部使用MessageDigest
String simpleHash = new SimpleHash("SHA-1", str, salt).toString();

查看更多

并发编程-执行异步任务

异步编程的目标是:提交一个任务给线程池,在任务执行期间,提交者可以执行其他的逻辑,当提交的任务执行完成,通知提交者来获取执行结果

jdk并发包中的异步编程是通过Future 接口实现的:

1
2
3
4
5
6
7
8
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}

泛型V是任务执行结果的类型。

我们通过如下方式提交任务给线程池:

查看更多

jvm(4)类加载机制以及类加载器

1、类加载器的分类

  1. Bootstrap ClassLoader 负责加载$JAVA_HOME中的 jre/lib/rt.jar里面所有的class 或者 Xbootclassoath选项指定的jar包,由C++实现,不是ClassLoader的子类
  2. Extenson ClassLoader 负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中的jre/lib/*.jar或者-Djava.ext.dirs指定目录下的jar包。
  3. App ClassLoader 负责加载classpath中指定的jar包以及 -Djava.class.path 所指定目录下的类和jar包
  4. Custom ClassLoader 通过java.lang.ClassLoader的子类自定义加载器。属于应用程序根据自身需要自定义的classLader。如Tomcat,Jboss都会根据J2EE规范自行实现ClassLoader
查看更多

并发编程-并发工具类

在JDK的并发包中提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Semaphore提供了并发流程控制手段,Exchanger提供了两个线程之间交换数据的手段,本文将配合应用场景介绍该如何使用这几个工具类。

1. CountDownLatch

CountDownLatch是JDK 5+里面闭锁的一个实现,他允许一个或多个线程等待其他线程完成各自的工作后再执行。

闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。

与CountDownLatch第一次交互是主线程等待其它的线程,主线程必须在启动其它线程后立即调用await方法,这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。

其他的N个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务,这种机制就是通过调用countDown()方法来完成的。每调用一次这个方法,在构造函数中初始化的count值就减1,所以当N个线程都调用了这个方法count的值等于0,然后主线程就能通过await方法,恢复自己的任务。

查看更多

jvm(2)类加载过程

下图描述的是jvm加载类过程的一个逻辑顺序,具体的执行顺序不一定如下图所示,不同版本的虚拟机有不同的实现方式,本文将按照逻辑顺序逐步分析类加载过程中都发生了什么。

加载流程

1 类加载时机

jvm规范中没有明确规定类“加载”的时机,但是规定了有且只有以下五种情况下需要jvm对类立即执行“初始化”操作:

  1. 虚拟机启动时,要先初始化主类(含main方法的类)
查看更多