jersey參數攔截注入

一、get請求時,用對象接受基本類型的參數

       基本思路:

       定義一個基本類作爲標識,讓所有的參數對象來繼承這個基本類;

       jersey可以在服務請求後,resource方法調用之前進入到攔截代碼塊;

       在攔截代碼塊中可以判斷resource方法的參數對象是否繼承了標識類;

       如果是,則利用反射將get提交的參數值set進參數對象;

    1、 定義標識類

              public class Pagination extends BaseObject{

 
 protected Integer pageSize=20;
                                           protected Integer pageNo=-1;       // -1 means don't paging

 @JsonIgnore
 protected Integer beginNo = 0;
 protected Integer total = 0;     }

 

   2、關鍵的一步,需要提供一個provider類繼承com.sun.jersey.spi.inject.InjectableProvider

          

@Provider
public class PaginationProvider implements InjectableProvider<QueryParam,Parameter> {

 @Context
  private HttpContext hc;
 @Context
 protected HttpServletRequest request;
 
 public PaginationProvider(@Context HttpContext hc, @Context HttpServletRequest request) {
        this.hc = hc;
        this.request = request;
    }
 

 @Override
 public ComponentScope getScope() {
  return ComponentScope.PerRequest;
 }


 @Override
 public Injectable getInjectable(ComponentContext ic, QueryParam a,
   Parameter c) {
  final Class clazz = c.getParameterClass();   // 獲取參數對象

  if (!Pagination.class.isAssignableFrom(clazz)) {  // 判斷是否繼承標識類
            return null;
        }
 

        return new Injectable<Object>() {

            public Object getValue() {
             Object parameterBean=null;
    try {
                parameterBean = clazz.newInstance();                
                 MultivaluedMap<String, String> params = hc.getUriInfo().getQueryParameters();//獲取get提交的參數值
                 Class clz = clazz;
                 for (;!clz.equals(Object.class);clz=clz.getSuperclass()) {
               Field[] fields = clz.getDeclaredFields();
               for (Field field:fields) {
                      Object value = params.get(field.getName());
                      if (value == null) {
                       continue;
                      }
                      try {
        BeanUtils.setProperty(parameterBean, field.getName(), value); //屬性拷貝 
       } catch (IllegalAccessException e) {
       
        e.printStackTrace();
       } catch (InvocationTargetException e) {
        
        e.printStackTrace();
       }
               }
                 }
              //對象參數已經注入了所提交的參數值


              // 設置上下文   //這裏還可以做其他工作
              if (ContextPagination.class.isAssignableFrom(clazz)) {
               User user = (User)request.getAttribute(CacheBase.USERINFO);
               ContextPagination context = (ContextPagination)parameterBean;
               context.setCurrUserId(user.getUserId());
               context.setCurrFeedId(user.getFeedId());
               context.setNetworkId(user.getNetworkId());
               context.setOrgId(user.getOrgId());
               context.setCurrUserName(user.getUsername());
              }
    } catch (InstantiationException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    } catch (IllegalAccessException e1) {
     e1.printStackTrace();
    }
    
                return parameterBean;
            }
        };
 }

}

二、url訪問服務之前可以將參數進行攔截,比如對參數進行權限檢查,

        但post參數只能使用一次,當權限檢查使用之後,

        resource服務裏面就不能獲取該參數;

           基本思路:將參數取出之後,在設置一遍,聽起來很簡答,但jersey將設置的方法隱藏的很深,找了好久才找到了

         

   private List getValFromRequest(ContainerRequest request , String[] targets) throws JSONException{
  List values = new ArrayList();
  String var = null;
  if(targets != null && targets.length > 0){
   String method = request.getMethod();
   if (method.equals("GET")) {
    MultivaluedMap map = request.getQueryParameters();
    for (int i=0;i
     List list = (List)map.get(targets[i]);
     var = list.get(0);
     values.add(var);
    }
   }
   if (method.equals("POST")) {
    MediaType tmp = request.getMediaType();
    MediaType media = new MediaType(tmp.getType(), tmp.getSubtype());
    if (media.equals(MediaType.APPLICATION_JSON_TYPE)) {
     Object object = request.getEntity(Object.class);
     for (int i=0;i
      try {
       var = BeanUtils.getProperty(object, targets[i]);
      } catch (IllegalAccessException e) {
       logger.error(e.getMessage(),e.getCause());
      } catch (InvocationTargetException e) {
       logger.error(e.getMessage(),e.getCause());
      } catch (NoSuchMethodException e) {
       logger.error(e.getMessage(),e.getCause());
      }
      values.add(var);
     }
     request.setEntity(Object.class, Object.class, null, null, null, object);
    }
   }
  }
  return values;
 }

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章