Spring AOP && Redis

在寫控制器過程中看到了如下注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLogger {
    String module() default "";

    String methods() default "";
    
    String source() default "";
}

以前在SpringBoot的小項(xiàng)目中泊交,Controller與Service并沒有完全分離,界限不清晰眷射,因此這個項(xiàng)目幫助我又一次深入理解了AOP镇辉。

一、AOP的使用(記錄操作日志的例子)

1厅目、自定義注解

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface OperLog {   
    //操作類型
    String operType() default "";
    //操作人
    String user() default "";
    //操作人下標(biāo)
    int userIndex() default -1;
}

2番枚、攔截器 (切面類)

@Aspect
@Component
public class OperLogInterceptor {

    觸發(fā)條件為:com.opr包下面所有類且注解為OperLog的
    @Around("within(com.opr..*) @annotation(operLog)")
    public Object doAroundMethod(ProceedingJoinPoint pjd,OperLog operLog) throws Throwable {
        long startTime=System.currentTimeMillis();//開始時間
        
        Object[] params = pjd.getArgs();//獲取請求參數(shù)
        System.out.println("監(jiān)聽到傳入?yún)?shù)為:");
        for(Object param:params) {
            System.out.println(param);
        }
        
        //###################上面代碼為方法執(zhí)行前#####################
        Object result  = pjd.proceed();//執(zhí)行方法,獲取返回參數(shù)
        //###################下面代碼為方法執(zhí)行后#####################
        System.out.println("返回參數(shù)為:" + result);
        
        String user = operLog.userIndex()==-1?operLog.user():(String)params[operLog.userIndex()];//操作人
        String operType = operLog.operType();//操作類型
        System.out.println("操作人: " + user +" 操作類型: " + operType);
        
        long endTime=System.currentTimeMillis();//結(jié)束時間
        float excTime=(float)(endTime-startTime)/1000;
        System.out.println("執(zhí)行時間:"+excTime+"s");
        System.out.println("#######################分隔符##########################");
        return result;    
    }  
}

3损敷、Service

@Service("userService")
public class UserServiceImpl implements UserService {
    //設(shè)置默認(rèn)值葫笼,模擬登錄
    private final String userName = "admin";
    
    private final String password = "123456";
    
    @Override
    @OperLog(operType="用戶登錄",userIndex = 0 )//0為下標(biāo),代表傳入的第一個參數(shù)拗馒,這里取userName為示例路星。實(shí)際場景可以在session中取操作人!
    public boolean userLogin(String userName,String password) {
        boolean flag = false;
        
        if(this.userName.equals(userName) && this.password.equals(password)) {
            flag = true;
        }
               return flag;
    }
}

4诱桂、控制器

@Controller
@RequestMapping("user")
public class UserController {
    
    @Autowired UserService userService;
    
    /***
     * 首頁
     * @param request
     * @param response
     * @return ModelAndView
     */
    @RequestMapping("index")
    public ModelAndView index(HttpServletRequest request,HttpServletResponse response) {
        return new ModelAndView("index");
    }

    /***
     * 登錄
     * @param request
     * @param response
     * @return ModelAndView
     */
    @RequestMapping("userLogin")
    public ModelAndView userLogin(HttpServletRequest request,HttpServletResponse response,
            String userName,String password) {
        ModelAndView mv = new ModelAndView();
        try {
            
            boolean result = userService.userLogin(userName,password);
            if(result) {
                mv.setViewName("success");
            }else {
                mv.setViewName("error");
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }       
        return mv;       
    }
}

5洋丐、運(yùn)行效果
登陸界面:



前端頁面:



后臺顯示:

使用AOP實(shí)現(xiàn)用戶登陸驗(yàn)證

@Aspect
@Component
@Slf4j
public class SellerAuthorizeAspect {

    @Autowired
    private StringRedisTemplate redisTemplate;

   //定義一個切入點(diǎn)
    @Pointcut("execution(public * com.imooc.controller.Seller*.*(..))" +
    "&& !execution(public * com.imooc.controller.SellerUserController.*(..))")
    public void verify() {}

    @Before("verify()")
    public void doVerify() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //查詢cookie
        Cookie cookie = CookieUtil.get(request, CookieConstant.TOKEN);
        if (cookie == null) {
            log.warn("【登錄校驗(yàn)】Cookie中查不到token");
            throw new SellerAuthorizeException();
        }

        //去redis里查詢
        String tokenValue = redisTemplate.opsForValue().get(String.format(RedisConstant.TOKEN_PREFIX, cookie.getValue()));
        if (StringUtils.isEmpty(tokenValue)) {
            log.warn("【登錄校驗(yàn)】Redis中查不到token");
            throw new SellerAuthorizeException();
        }
    }
}

CookieUtil是自己寫的獲取HttpServletRequest的工具類

ReidsTemplate 與 StringRedisTemplate 的區(qū)別:

RedisTemplate使用的序列類在在操作數(shù)據(jù)的時候呈昔,比如說存入數(shù)據(jù)會將數(shù)據(jù)先序列化成字節(jié)數(shù)組存入redis數(shù)據(jù)庫:

當(dāng)Redis當(dāng)中的數(shù)據(jù)值是以可讀的形式顯示出來的時候,只能使用StringRedisTemplate才能獲取到里面的數(shù)據(jù)友绝。

當(dāng)redis數(shù)據(jù)庫里面存的本來就是字符串?dāng)?shù)據(jù)或者要存取的數(shù)據(jù)就是字符串類型的時候堤尾,那么你就使用StringRedisTemplate即可。
但是如果你的數(shù)據(jù)是復(fù)雜的對象類型迁客,而取出的時候又不想做任何的數(shù)據(jù)轉(zhuǎn)換郭宝,直接從Redis里面取出一個對象,那么使用RedisTemplate是更好的選擇掷漱。

Q:實(shí)體類為什么要序列化:
序列化的實(shí)體是對象剩蟀,結(jié)果也是對象

A:進(jìn)程間的對象傳送:無論是何種類型的數(shù)據(jù)切威,都會以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送育特。發(fā)送方需要把這個對象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送先朦;接收方則需要把字節(jié)序列再恢復(fù)為對象缰冤。

redis的基本操作:

redisTemplate.opsForValue();//操作字符串String 
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set

redisTemplate.opsForValue().set(key,value)); 
redisTemplate.opsForValue().get(key)); 

RedisTemplate.opsForSet().isMember("red_123", "1")//根據(jù)key查看集合中是否存在指定數(shù)據(jù)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喳魏,隨后出現(xiàn)的幾起案子棉浸,更是在濱河造成了極大的恐慌,老刑警劉巖刺彩,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迷郑,死亡現(xiàn)場離奇詭異,居然都是意外死亡创倔,警方通過查閱死者的電腦和手機(jī)嗡害,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畦攘,“玉大人霸妹,你說我怎么就攤上這事≈海” “怎么了叹螟?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長台盯。 經(jīng)常有香客問我罢绽,道長,這世上最難降的妖魔是什么静盅? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任良价,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棚壁。我一直安慰自己,他們只是感情好栈虚,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布袖外。 她就那樣靜靜地躺著,像睡著了一般魂务。 火紅的嫁衣襯著肌膚如雪曼验。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天粘姜,我揣著相機(jī)與錄音鬓照,去河邊找鬼。 笑死孤紧,一個胖子當(dāng)著我的面吹牛豺裆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播号显,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼臭猜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了押蚤?” 一聲冷哼從身側(cè)響起蔑歌,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揽碘,沒想到半個月后次屠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雳刺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年劫灶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掖桦。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡浑此,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滞详,到底是詐尸還是另有隱情凛俱,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布料饥,位于F島的核電站蒲犬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岸啡。R本人自食惡果不足惜原叮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奋隶,春花似錦擂送、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至境氢,卻和暖如春蟀拷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萍聊。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工问芬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寿桨。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓此衅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亭螟。 傳聞我的和親對象是個殘疾皇子炕柔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)媒佣,斷路器匕累,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • IoC 容器 Bean 的作用域 自定義作用域?qū)崿F(xiàn) org.springframework.beans.facto...
    Hsinwong閱讀 2,476評論 0 7
  • 在手賬本上臨募了一個長腿的萌妹子,但是沒忍住上了個色默伍,結(jié)果就變得臟兮兮的畫面了
    栗喵喵閱讀 155評論 0 0
  • 【 我怎樣才能從當(dāng)下到達(dá)我的目的地也糊?】在思考這個問題之前炼蹦,首先,我覺得先弄明白自己的目的地是什么狸剃?應(yīng)用古典老...
    吖坤要加油閱讀 303評論 0 0
  • 在這自由開放的社會掐隐,經(jīng)濟(jì)發(fā)展給你我平頭百姓帶來更多話語權(quán)。不同的聲音充斥在這繁華背后是再正常不過钞馁,社會需要發(fā)...
    happny閱讀 264評論 0 0