Interceptor是JFinal中的拦截器,它只拦截action请求,对静态资源比如css,image等是不拦截的,且它不能重写改变请求参数
Handler则像servlet中的Filter拦截一切请求响应,不管是action请求,还是访问静态资源都会进行拦截,并且可以对拦截的参数,进行重写,重写URL
Inteceptor 拦截器通常写法判断是否登录:
public void intercept(ActionInvocation ai) {
Controller c = ai.getController();
UserModel u = c.getSessionAttr("user");
System.out.println(ai.getControllerKey());
if(ai.getControllerKey().equals("/")||ai.getControllerKey().contains("pic")||ai.getActionKey().contains("login/login")){
ai.invoke();
}else{
if(u==null){
try {
//在JFinal中直接使用c.getResponse().getWriter().print("脚本");是不会有效果的,须使用renderHtml
c.renderHtml("<script>alert('未登录');location.href='../xmgl_login.html'</script>");
// c.redirect("/xmgl_login.html");
} catch (Exception e) {
e.printStackTrace();
}
}else{
ai.invoke();
}
}
// ai.invoke();
}
在Class或者action(只有参数为空且为public的方法才是action)中添加拦截器,用注解@Before,@Clear是清楚当前位置以上的所有拦截器
例如 :
@Before(AAA.Class)
Class A{
@Before(testInteceptor.Class)
@Clear//对该拦截器testInteceptor不起作用,因为clear只清除Class A (AAA.class)以及它上层的拦截器
public void b(){
}
}
拦截器分为全局拦截器在config初始化java文件配置,第二种是注入拦截器Inject,第三种是class类拦截器,第四种是action 方法拦截器。(四个优先顺序也是从高到低)
如果业务方法想使用拦截器可以使用Ehancer.ehance 或者Duang.duang或者是Controller.ehance方法进行加强强化之后就可以使用拦截器了
例如:
Class OrderService{
@Before(AA.class)
public void service(String aa,String bb){
}
}
class test extend Controller{
public void t(){
OrderService os = enahce(OrderService.class);//对业务层进行加强
os.service(aa,bb);//在ehance加强之后 拦截器才起效果
}
}
使用enhance还有使用inject注入方法,通过注入可以给JAR包中的类 注入拦截器,因为我们无法修改JAR包添加@Before,
Inject用法, OrderService os = Enhancer.enhance(TestXX.class,Tx.class);给TestXX注入TX事务拦截器,通过注入的拦截器
将拦截目标文件的所有action
还有要注意的是直接renderJavascript("<script>alert('xx')</script>") 只会在页面输出<script>alert('xx')</script">这段文字, 正确的使用方法是,在页面脚本中
<script src="/app/js"></script> src中的地址即为action的地址 public void js(){ renderJavascript(" function test(){ alert(' test') } ")}