jFinal中的Interceptor拦截器

     在项目完成之后,闲着无聊,写起了我人生中第一篇博文,不好勿喷。

     我们经常会有这样的应用场景:在Java开发的web后台管理项目中,所有表单提交如果不进行专门的处理,可能由于某些原因出现重复提交的现象,例如进行一些表单新增保存时等;还比如说一些需要登录才可以操作的权限,这些权限拦截等。
例如:在进行保存生成订单操作时,需要防止重复提交的操作和事务控制的操作(假设这个事务可以写在Controller里)

@Before({AsynchronousTokenInterceptor.class,Tx.class})
public void doSaveOrder(){
  try {
   //文件上传,需要先获取文件,否则获取不到表单
   List<UploadFile> files = this.getFiles(FileUtils.getPropertyValue("/config/path.properties", "discountApplyFilePath"));
   List<GoodsOrderDetail> gods = this.getModels(GoodsOrderDetail.class);//绑定商品
   List<Register> regs = this.getModels(Register.class);//报名
   FinanceOrder order = this.getModel(FinanceOrder.class);//订单
   List<FinanceOrderDiscount> orderDis = this.getModels(FinanceOrderDiscount.class);//订单优惠填写资料
   String dis = this.getPara("dis");//优惠申请
   String adis[] = null ;
   if(!StringUtils.isBlank(dis)){
    adis = dis.split(",");
   }
   //---------帮其他校区收费时设置
   Integer otherDeptId = this.getParaToInt("otherDeptId");
   String otherDeptName = this.getPara("otherDeptName");
   Users user = (Users) this.getUserInfo();
   Integer oldDeptId = user.getInt("deptId");
   String oldDeptName = user.getStr("deptName");
   user.set("deptId", otherDeptId);
   user.set("deptName", otherDeptName);
   this.setSessionAttr("otherDeptId", otherDeptId);
   this.setSessionAttr("otherDeptName", otherDeptName);
   //---------
   String handsel[]=this.getParaValues("handsel");
   List<RegistDiscount> vous = this.getModels(RegistDiscount.class, "vouDis");//优惠券优惠
   List<RegistDiscount> selectDis = this.getModels(RegistDiscount.class);//选择优惠   
      //key:message代表返回结果,key:orderId 代表生成订单Id返回前台
      Map map = this.service.saveOrder(files, gods,regs,order,orderDis,adis,vous,selectDis,user,(List)this.getSessionAttr("regs"),(List)this.getSessionAttr("noRepeatValidateDis"),handsel);
   user.set("deptId", oldDeptId);
   user.set("deptName", oldDeptName);
      renderJsonMsgResult((String) map.get("message"), "{orderId:"+map.get("orderId")+"}");     
  }catch(Exception e){
   e.printStackTrace();
   //由于前台使用ajaxUpload模拟ajax提交实际是form.submit,所以需要特殊控制,否则404
   this.setAttr("exception_on", 1);
   String errorMsg;
   if(e instanceof XhException){
    errorMsg=e.getMessage();
   }else{
    errorMsg="系统错误,请与管理员联系!";
   }
   XhJSONResult result = new XhJSONResult(Boolean.FALSE, errorMsg, "",this.getAsyncTokenId());
   this.renderJson(result);
  }
 }

下面是这个防止重复提交的代码:

public class AsynchronousTokenInterceptor implements Interceptor {
 private Logger logger=Logger.getLogger(AsynchronousTokenInterceptor.class);
 public void intercept(ActionInvocation ai) {
  try {
   Controller controller = ai.getController();
   HttpServletRequest request = controller.getRequest();
   String paraAsyncTokenId = controller.getPara("async_token_static").toString();
   String sessionAsyncTokenId = controller.getSessionAttr("asyncTokenId").toString();
   
   if(paraAsyncTokenId.equals(sessionAsyncTokenId)){
    controller.setSessionAttr("asyncTokenId", UUID.randomUUID());
    logger.info("提交!");
    ai.invoke();
   }else{
    if(request.getHeader("x-requested-with")!= null  
                  && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
     XhJSONResult result = new XhJSONResult(Boolean.FALSE, "重复提交了!", "",paraAsyncTokenId);
     controller.renderJson(result);
    }
    logger.info("重复提交了!");
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

@Before注解(jFinal源码):

/**
 * Before is used to configure Interceptor or Validator.
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Before {
 Class<? extends Interceptor>[] value();
}

这里面都用的是jFinal里的@Beafore注解,具体的实现类中都实现了Interceptor接口拦截器

你可能感兴趣的:(jFinal中的Interceptor拦截器)