当前位置: 编程技术>综合
本页文章导读:
▪Grails中的过滤器(Filter)和拦截器(Interceptor) 先摘录一段Java中两者的区别
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调 。
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 。
3、拦截器只能对action请求起作用,而.........
▪SimpleDateFormat线程不安全解决办法 SimpleDateFormat是线程不安全的,如果不考虑代价的问题,那么我们完全可在每次需要的时候直接new一个,但是这不是一个很好的解决方式,那么有没有一个相对性能高的办法?
有!一定有,最.........
▪数据库3范式,解释 数据库设计有三种范式。1NF,2NF,3NF.并且是父子级的关系。如:要满3NF,就要依次1NF,2NF。
1NF:就是数据库中每列所代表属性,不能在划分出其它属性。这点就算是白痴也能满足。应为这里的.........
[1]Grails中的过滤器(Filter)和拦截器(Interceptor)
先摘录一段Java中两者的区别
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调 。
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 。(这也就是为什么在Grails文档里,拦截器属于Controlloer章节的一个小节;而过滤器自己是一个章节)
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能 。
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 。
Grails的文档是这样描述的
If your interceptor is likely to apply to more than one controller, you are almost certainly better off writing a Filter. Filters can be applied to multiple controllers or URIs without the need to change the logic of each controller
所以,对于登陆验证,filter更加适合,默默的、悄悄的,减少继承。
interceptor更加适合处理一个controller内的特殊情况。
拦截器
abstract class BaseController { //需要验证的Controller继承之
def beforeInterceptor = [action: this.&auth, except: ['login']]
private def auth() {
if (!session.loginUser) {
redirect(controller: 'user', action: 'login')
return false
}
}
}
过滤器
grails create-filters security
class SecurityFilters {
def filters = {
loginCheck(controller: '*', action: '*', uriExclude: '/user/login') {
before = {
if (!session.loginUser) {
redirect(controller: 'user', action: 'login')
return false
}
}
}
}
}
有趣的测试,如果同时设置了拦截器和过滤器,过滤器(是容器级的)工作在拦截器(Controller级的)之前。
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调 。
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 。(这也就是为什么在Grails文档里,拦截器属于Controlloer章节的一个小节;而过滤器自己是一个章节)
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能 。
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 。
Grails的文档是这样描述的
If your interceptor is likely to apply to more than one controller, you are almost certainly better off writing a Filter. Filters can be applied to multiple controllers or URIs without the need to change the logic of each controller
所以,对于登陆验证,filter更加适合,默默的、悄悄的,减少继承。
interceptor更加适合处理一个controller内的特殊情况。
拦截器
abstract class BaseController { //需要验证的Controller继承之
def beforeInterceptor = [action: this.&auth, except: ['login']]
private def auth() {
if (!session.loginUser) {
redirect(controller: 'user', action: 'login')
return false
}
}
}
过滤器
grails create-filters security
class SecurityFilters {
def filters = {
loginCheck(controller: '*', action: '*', uriExclude: '/user/login') {
before = {
if (!session.loginUser) {
redirect(controller: 'user', action: 'login')
return false
}
}
}
}
}
有趣的测试,如果同时设置了拦截器和过滤器,过滤器(是容器级的)工作在拦截器(Controller级的)之前。
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
[2]SimpleDateFormat线程不安全解决办法
SimpleDateFormat是线程不安全的,如果不考虑代价的问题,那么我们完全可在每次需要的时候直接new一个,但是这不是一个很好的解决方式,那么有没有一个相对性能高的办法?
有!一定有,最基本的可以解决问题但是性能上并不一定是最好的,那么我们可以借助ThreadLocal来实现,具体的代码实现如下:
private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() { protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } };
在进行get操作的时候直接从threadLocal中获取,代码如下:
public static DateFormat getCommonDateFormat() { DateFormat sdf = threadLocal.get(); return sdf; }
跟随源码ThreadLocal的get操作:
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }
我们发现他维护了一个ThreadLocalMap,当此时的thread已经创建过,那么直接返回,没有的话那么执行setInitialValue(),我们看一下setInitialValue我们发现:
private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; }
他去初始化一个也就是我们new一个,然后set到相应的map中去。
结论:
1.如果不是重复利用的话其性能未必要,因为每次依然是new,只是说在某线程多次访问此实例的时候性能才会提升。 2.同时我们也发现了一个线程并发的实现方式。
已有 1 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
[3]数据库3范式,解释
数据库设计有三种范式。1NF,2NF,3NF.并且是父子级的关系。如:要满3NF,就要依次1NF,2NF。
1NF:就是数据库中每列所代表属性,不能在划分出其它属性。这点就算是白痴也能满足。应为这里的属性对应数据库的字段类型如:Number,varchar。数据库已经限制死了。除非你能创建一种类型。
2NF:就是区分每个记录或者说行,怎么区分呢?最简单的就是ID。或者联合主键。这点白痴也能作出来。
3NF:这个就是 one-to-many时,要有个外键让many端对应到one端。而不是在many端,将one表的所有字段都在many段创建出来。这样数据有冗余。这个白痴也都知道
好了至此,传说中的3范式介绍清楚了。
相信大家平常都是这么做的,为什么要说这个呢?因为总有人会问你,知道数据设计的3范式么?
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
最新技术文章: