JFinal的Interceptor和Handler

来源:互联网 发布:郑钧灰姑娘 知乎 编辑:程序博客网 时间:2024/05/04 19:10

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')  }  ")}


0 0
原创粉丝点击