@RequestMapping(method = RequestMethod.GET)
 @ResponseBody
 public String page(@RequestParam(required = false) String q, PageParam pageParam) {
   List<SearchFilter> filters =
       StringUtils.isEmpty(q) ? new ArrayList<SearchFilter>() : SearchFilter.parseQuery(q);
   filters.add(new SearchFilter("creator.id", Operator.EQ, currentUserId()));
   filters.add(new SearchFilter("status", Operator.EQ, Share.Status.CREATED));
   Page<Share> page = shareService2.findAll(filters, pageParam.getPageable(Share.class));
   return Gsons.filterByFields(ShareDto.Brief.class, pageParam.getFields())
       .toJson(PageDto.of(page, ShareDto.toBrief));
 }
 /**
  * 搜索我搜到的分享
  *
  * @param q
  * @param pageParam
  * @return
  */
 @RequestMapping(value = "/received", method = RequestMethod.GET)
 @ResponseBody
 public String pageReceived(@RequestParam(required = false) String q, PageParam pageParam) {
   List<SearchFilter> filters =
       StringUtils.isEmpty(q) ? new ArrayList<SearchFilter>() : SearchFilter.parseQuery(q);
   filters.add(new SearchFilter("recipient.id", Operator.EQ, currentUserId()));
   filters.add(new SearchFilter("isDeleted", Operator.EQ, Boolean.FALSE));
   filters.add(new SearchFilter("share.status", Operator.NE, Share.Status.CANCELED));
   Page<ReceivedShare> page =
       receivedShareService.findAll(filters, pageParam.getPageable(ReceivedShare.class));
   return Gsons.filterByFields(ReceivedShareDto.Brief.class, pageParam.getFields())
       .toJson(PageDto.of(page, ReceivedShareDto.toBrief));
 }
 @RequestMapping(value = "search", method = RequestMethod.GET)
 @ResponseBody
 public String search(
     @RequestParam("recipientType") String recipientType,
     @RequestParam(required = false) Long recipientId,
     PageParam pageParam) {
   Pageable pageable = pageParam.getPageable(Share.class);
   Page<Share> page = null;
   if (recipientId == null) {
     page = shareService2.findAll(currentUserId(), recipientType, pageable);
   } else {
     page = shareService2.findAll(currentUserId(), recipientType, recipientId, pageable);
   }
   return Gsons.filterByFields(ShareDto.Brief.class, pageParam.getFields())
       .toJson(PageDto.of(page, ShareDto.toBrief));
 }
/**
 * 使用redis保存principal,适用于集群版本
 *
 * @author Chen Hao
 */
@Service
public class RedisCachePrincipalService extends AbstractPrincipalService {

  private static final Logger logger = LoggerFactory.getLogger(RedisCachePrincipalService.class);

  private static final String FIELD_CLASS = "c";
  private static final String FIELD_PRINCIPAL = "p";
  private static final String FIELD_EXPIRES_IN = "ei";
  //	private static final String FIELD_LAST_TOUCH_TIME="ltt";
  private static final String FIELD_UPDATE_ON_TOUCH = "uot";

  @Autowired RedisOperator redisOperator;

  Gson gson = Gsons.defaultGsonNoPrettify();

  @Override
  public Principal getPrincipal(final String ticket) {
    List<String> res =
        redisOperator.execute(
            new JedisAction<List<String>>() {

              @Override
              public List<String> action(Jedis jedis) {
                List<String> res =
                    jedis.hmget(
                        ticket,
                        FIELD_CLASS,
                        FIELD_PRINCIPAL,
                        FIELD_EXPIRES_IN,
                        FIELD_UPDATE_ON_TOUCH);
                if (res == null || res.contains(null)) {
                  return null;
                }
                if (Boolean.valueOf(res.get(3))) {
                  long expire = Longs.tryParse(res.get(2));
                  jedis.expire(ticket, (int) (expire / 1000));
                }
                return res;
              }
            });
    if (res != null) {
      try {
        Class<?> clazz = Class.forName(res.get(0));
        return (Principal) gson.fromJson(res.get(1), clazz);
      } catch (Exception e) {
        logger.error("", e);
      }
    }
    return null;
  }

  @Override
  protected void saveHolder(final String ticket, final PrincipalHolder holder) {
    redisOperator.execute(
        new JedisActionNoResult() {

          @Override
          public void action(Jedis jedis) {
            Map<String, String> map = Maps.newHashMapWithExpectedSize(3);
            map.put(FIELD_CLASS, holder.principal.getClass().getCanonicalName());
            map.put(FIELD_PRINCIPAL, gson.toJson(holder.principal));
            map.put(FIELD_EXPIRES_IN, String.valueOf(holder.expiresIn));
            map.put(FIELD_UPDATE_ON_TOUCH, String.valueOf(holder.updateOnTouch));
            jedis.hmset(ticket, map);
            jedis.expire(ticket, (int) (holder.expiresIn / 1000));
          }
        });
  }
}