這是個人第一篇博客,可能碼的很差。本人是一名菜鳥,寫的不對的地方還望大神多多批評指點,歡迎留言,感激涕零。前端
此次是記錄使用aop維持小程序登陸狀態的一次隨筆,可能基礎不太好,卡在瞭如何在before方法中得到header中的3rdSession,也就是如何得到request。express
小程序每次請求須要驗證用戶是否登陸,若是header中3rdSession與後臺緩存中的不匹配,則斷定該用戶沒有登陸或登陸超時。小程序
before方法裏主要是攔截每次前端的請求,在before方法裏進行3rdSession匹配,匹配成功返回loginStatus爲1,不然loginStatus0,而後小程序經過後臺傳回的loginStatus判斷用戶是否登陸。緩存
話很少說直接上代碼。cookie
1.首先寫一個切面類,裏面是aop的before和after方法session
1 public class IsUserLoginAdviceImpl { 2 public void isUserLogin() { 3 //得到前端請求的request對象 4 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 5 //初始化 6 String third_Session =""; 7 Cookie[] cookies = request.getCookies(); 8 for(Cookie cookie:cookies){ 9 if (cookie.getName().equals("third_Session")){ 10 //得到前端傳來的登陸憑證 third_Session 11 third_Session=cookie.getValue(); 12 } 13 } 14 //得到存入緩存中third_Session所對應的值,即用戶的openId+sessionKey 15 String third_session_value = (String) CacheUtils.get(third_Session); 16 int loginStatus =0; 17 //不爲空則說明登陸驗證成功,返回true 18 if (!StringUtils.isEmpty(third_session_value)){ 19 loginStatus =1; 20 CacheUtils.put("loginStatus",loginStatus); 21 }else { 22 //loginStatus爲0須要登陸 23 CacheUtils.put("loginStatus",loginStatus); 24 } 25 }
2.沒有用註解的方式配aop,在xml文件中配置spa
1 <!-- 指定切面所在的類--> 2 <bean id="isUserLogin" class="cn.xxx.xxx.xxx.IsUserLoginAdviceImpl"/> 3 <aop:config> 4 <!-- 關聯切面bean所對應的id--> 5 <aop:aspect id="confirmLogin" ref="isUserLogin"> 6 <!--切點 execution(): 表達式主體,第一個*表明全部的返回值類型;後面是包名;第二個*號:表示類名,*號表示全部的類; 7 第3個*表示全部的方法;最後一個..表明全部的參數 ,後面一個表達式是登陸不須要攔截--> 8 <aop:pointcut id="isUserLoginPointcut" expression="execution(* cn.xxx.xxx.xxx.*.*(..)) and !execution(* cn.xxx.xxx.xxx.UsersApiController.wxLogin(..))"/> 9 <!-- 指定before方法,關聯切點id--> 10 <aop:before method="isUserLogin" pointcut-ref="isUserLoginPointcut"/> 11 <!-- 指定after方法,關聯切點id--> 12 <aop:after method="removeLoginStatusCache" pointcut-ref="isUserLoginPointcut"/> 13 </aop:aspect> 14 </aop:config>
這裏開始一直糾結如何得到小程序header裏攜帶的3rdSession,由於平時得到request都是在接口中(HttpServletRequest req)這樣的方式,這種方式並不適用這種狀況,最後查了一下得到request的幾種方式,找到了答案。.net
1 //得到前端請求的request對象 2 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
最後貼出原文地址,感興趣的朋友能夠看一下。https://blog.csdn.net/ChlatZed/article/details/72923351code
您的每一次批評指正都會讓我進步,歡迎留言指正!xml