项目精妙(一)--拦截器

目录

一个简单的登录拦截,怎么把缓存和自定义的注解合并在一起

首先定义一个 注解

注解:就是给方法或者变量加上可以便于统一管理的属性值,

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Authorize {
    String type() default ""; 
    String value() default ""; 
    boolean disable() default false;
}

在controller中使用

就是在方法上加上注解

 @RequestMapping(value = "/get",method = RequestMethod.GET)
    @ResponseBody
    @Authorize(disable = true)
    public Object get(){
    }

拦截器

属于springMVC的拦截器,这样可以控制到 按钮级别的权限细粒度

  public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception { 
     //直接将注解类 获取出来,进行判断是否需要判断权限                        
            Authorize authPrivileges = ((HandlerMethod) handler).getMethodAnnotation(Authorize.class);  
            if (authPrivileges != null && authPrivileges.disable())
                return true;
                然后根据 request中的 token 到缓存中获取信息,没有获取到 则 return false ,获取到了就给 登陆者缓存续期

                }

缓存的设计

  1. 首先是适配的类 接口就是抽象方法的集合
public interface CacheAdapter { 
    Boolean exists(String type, Object key); 
    void set(String type, Object key, Object value); 
    void set(String type, Object key, Object value, int seconds); 
    <T> T get(String type, Object key, Type clsType); 
    Integer getInteger(String type, Object key); 
    BigDecimal getBigDecimal(String type, Object key);
       void clean(); 
    void remove(String type, Object key);
    }
  1. 实现这个适配器的实现类
    * 由于是使用的redis,所以我先 给redis写一个抽象类(包含的是需要一些默认的实现的方法,或者是需要一直会变动的方法,捕捉子类的通用特性)
public abstract class RedisBase {
    public abstract void set(byte[] key, byte[] value);

    public abstract void set(byte[] key, byte[] value, int seconds);

    public abstract byte[] get(byte[] key);

    public abstract Boolean exists(byte[] key);

    public abstract void remove(byte[] key);

    public abstract void clean();
}

*具体的实现类


public class RedisCache implements CacheAdapter {

    protected RedisBase redis = null;

    public RedisCache() { 
    } 
    public RedisCache(Class type) {
        try {
            redis = (RedisBase) type.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    @Override
    public Boolean exists(String type, Object key) {
        byte[] _key = getHash(type, key);
        return redis.exists(_key);
    }

    @Override
    public void set(String type, Object key, Object value) {
        byte[] _key = getHash(type, key);
        String _val;

        try {
            _val = JSONUtil.stringify(value);
            redis.set(_key, _val.getBytes());
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void set(String type, Object key, Object value, int seconds) {
        byte[] _key = getHash(type, key);
        String _val;

        try {
            _val = JSONUtil.stringify(value);
            redis.set(_key, _val.getBytes(), seconds);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    @Override
    public <T> T get(String type, Object key, Type clsType) {
        byte[] _key = getHash(type, key);
        String _val; 
        byte[] bytes = redis.get(_key); 
        T result = null; 
        if (bytes != null) {
            _val = new String(bytes);
            try {
                result = JSONUtil.parse(_val, clsType);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return result;
    }

    @Override
    public Integer getInteger(String type, Object key) {
        return get(type, key, Integer.class);
    }

    @Override
    public void clean() {
        redis.clean();
    }

    @Override
    public void remove(String type, Object key) {
        byte[] _key = getHash(type, key);
        redis.remove(_key);
    }

    private byte[] getHash(String type, Object key) {
        return (type.toUpperCase().hashCode() + "-" + key.hashCode()).getBytes();
    }
}
  1. sdf
  2. asdf
  3. asdf
  4. asdf
  5. asdf
  6. 8.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值