<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用者存取介面驗證,如果使用者沒有登入,則不讓他存取除登入外的任何介面。
實現思路:
1.前端登入,後端建立token(通過JWT這個依賴),返給前端
2.前端存取其他介面,傳遞token,後端判斷token存在以或失效
3.失效或不存在,則返回失效提示,前端根據介面返回的失效提示,讓其跳轉到登入介面
定義2個註解,1個用於任何介面都能存取,另外一個用於需要登入才能存取
呼叫都通過註解
package com.example.etf.story.tools; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface PassToken { boolean required() default true; }
登入才能通過
package com.example.etf.story.tools; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface UserLoginToken { boolean required() default true; }
註解的作用說明
@Target代表此註解,能@到哪些程式碼上
@Target
:註解的作用目標
@Target(ElementType.TYPE)
——介面、類、列舉、註解@Target(ElementType.FIELD)
——欄位、列舉的常數@Target(ElementType.METHOD)
——方法@Target(ElementType.PARAMETER)
——方法引數@Target(ElementType.CONSTRUCTOR)
——建構函式@Target(ElementType.LOCAL_VARIABLE)
——區域性變數@Target(ElementType.ANNOTATION_TYPE)
——註解@Target(ElementType.PACKAGE)
——包@Retention
:註解的保留位置
RetentionPolicy.SOURCE
:這種型別的Annotations
只在原始碼級別保留,編譯時就會被忽略,在class
位元組碼檔案中不包含。RetentionPolicy.CLASS
:這種型別的Annotations
編譯時被保留,預設的保留策略,在class
檔案中存在,但JVM
將會忽略,執行時無法獲得。RetentionPolicy.RUNTIME
:這種型別的Annotations
將被JVM
保留,所以他們能在執行時被JVM
或其他使用反射機制的程式碼所讀取和使用。@Document
:說明該註解將被包含在javadoc
中@Inherited
:說明子類可以繼承父類別中的該註解然後springBoot攔截器驗證token
攔截器攔截,除了登入和傳送簡訊,不攔截,其他都攔截
package com.example.etf.story.tools; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.Resource; @Configuration public class MyMvcConfig implements WebMvcConfigurer { @Resource private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //註冊自己的攔截器,並設定攔截的請求路徑 //addPathPatterns為攔截此請求路徑的請求 //excludePathPatterns為不攔截此路徑的請求 registry.addInterceptor(loginInterceptor).addPathPatterns("/story/*").excludePathPatterns("/story/sendSMS") .excludePathPatterns("/story/signOrRegister"); } }
攔截的時候,呼叫的方法,給誰通過
其中service查詢資料庫,有沒有使用者,的方法要自己寫
package com.example.etf.story.tools; import com.auth0.jwt.JWT; import com.auth0.jwt.exceptions.JWTDecodeException; import com.example.etf.story.dao.R; import com.example.etf.story.paramer.UserInfoParam; import com.example.etf.story.service.TestClientService; import com.example.etf.story.service.TokenUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Method; @Slf4j @Component public class LoginInterceptor extends R implements HandlerInterceptor { /** * 目標方法執行前 * 該方法在控制器處理請求方法前執行,其返回值表示是否中斷後續操作 * 返回 true 表示繼續向下執行,返回 false 表示中斷後續操作 * * @return */ @Resource private TestClientService testClientService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token");// 從 http 請求頭中取出 token // 如果不是對映到方法直接通過 if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); //檢查方法是否有passtoken註解,有則跳過認證,直接通過 if (method.isAnnotationPresent(PassToken.class)) { PassToken passToken = method.getAnnotation(PassToken.class); if (passToken.required()) { return true; } } //檢查有沒有需要使用者許可權的註解 if (method.isAnnotationPresent(UserLoginToken.class)) { UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class); if (userLoginToken.required()) { // 執行認證 if (token == null) { throw new RuntimeException("無token,請重新登入"); } // 獲取 token 中的 user id String phone; try { phone = JWT.decode(token).getClaim("phone").asString(); } catch (JWTDecodeException j) { throw new RuntimeException("token不正確,請不要通過非法手段建立token"); } //查詢資料庫,看看是否存在此使用者,方法要自己寫 UserInfoParam userInfoParam = testClientService.selectUserByPhone(phone); if (userInfoParam == null) { throw new RuntimeException("使用者不存在,請重新登入"); } // 驗證 token if (TokenUtils.verify(token)) { return true; } else { throw new RuntimeException("token過期或不正確,請重新登入"); } } } throw new RuntimeException("沒有許可權註解一律不通過"); } /** * 目標方法執行後 * 該方法在控制器處理請求方法呼叫之後、解析檢視之前執行 * 可以通過此方法對請求域中的模型和檢視做進一步修改 */ @Override public void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle執行{}"); } /** * 頁面渲染後 * 該方法在檢視渲染結束後執行 * 可以通過此方法實現資源清理、記錄紀錄檔資訊等工作 */ @Override public void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion執行異常"); } }
在controller層加入註解進行測試
加入全域性,異常類,這樣當異常,會返回你所指定的異常
package com.example.etf.story.tools; import com.alibaba.fastjson.JSONObject; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class GloablExceptionHandler { @ResponseBody @ExceptionHandler(Exception.class) public Object handleException(Exception e) { String msg = e.getMessage(); if (msg == null || msg.equals("")) { msg = "伺服器出錯"; } JSONObject jsonObject = new JSONObject(); jsonObject.put("message", msg); jsonObject.put("status",500) return jsonObject; } }
成功
我們測試一下加token後的
因為資料庫裡,我沒有插入,所以不存在,我們在隨便寫個token
我們在試試
程式設計師使用:方法不加註解,測試
程式設計師使用:加上,呼叫通過,註解
我們試試,加上通過註解
我們在試試從中獲取token
springboot對請求的介面實現token攔截以及引數校驗_kotomeli的部落格-CSDN部落格_springboot攔截請求引數
到此這篇關於SpringBoot登入驗證token攔截器的實現的文章就介紹到這了,更多相關SpringBoot token攔截器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45