Java之Spring AOP 實(shí)現(xiàn)用戶權(quán)限驗(yàn)證
每個項(xiàng)目都會有權(quán)限管理系統(tǒng)
無論你是一個簡單的企業(yè)站,還是一個復(fù)雜到爆的平臺級項(xiàng)目,都會涉及到用戶登錄、權(quán)限管理這些必不可少的業(yè)務(wù)邏輯。有人說,企業(yè)站需要什么權(quán)限管理阿?那行吧,你那可能叫靜態(tài)頁面,就算這樣,但你肯定也會有后臺管理及登錄功能。
每個項(xiàng)目中都會有這些幾乎一樣的業(yè)務(wù)邏輯,我們能不能把他們做成通用的系統(tǒng)呢?
AOP 實(shí)現(xiàn)用戶權(quán)限驗(yàn)證
AOP 在實(shí)際項(xiàng)目中運(yùn)用的場景主要有權(quán)限管理(Authority Management)、事務(wù)管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和調(diào)試管理(Debugging)等。
所以,權(quán)限驗(yàn)證正好我們可以使用 AOP 來直接實(shí)現(xiàn)。具體你項(xiàng)目中權(quán)限怎么管理,管理的粒度是什么級別這些完全取決于項(xiàng)目需要,這里完全不做任何的討論。
先說思路:利用自定義注解及攔截器來在你需要的時候,進(jìn)行你需要的一些權(quán)限認(rèn)證。這里依然涉及到的有enum(枚舉)
、annotation(自定義注解)
及攔截器相關(guān)知識,廢話不多說,直接開寫代碼。
開始擼一下代碼
**一、建立AuthorityType.java
枚舉類
public enum AuthorityType { // 登錄和權(quán)限都驗(yàn)證 默認(rèn) Validate, // 不驗(yàn)證 NoValidate, // 不驗(yàn)證權(quán)限 NoAuthority; }
這個枚舉類的作用,依然是使自定義注解用起來爽到還想要。
二、新建Authority.java
自定義注解類
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface Authority { // 默認(rèn)驗(yàn)證 AuthorityType value() default AuthorityType.Validate; }
三、再建一個AuthorityAnnotationInterceptor.java
類
/** * 權(quán)限認(rèn)證攔截器 * */ public class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod hm = (HandlerMethod) handler; Class<?> clazz = hm.getBeanType(); Method m = hm.getMethod(); try { if (clazz != null && m != null) { boolean isClzAnnotation = clazz.isAnnotationPresent(Authority.class); boolean isMethondAnnotation = m.isAnnotationPresent(Authority.class); Authority authority = null; // 如果方法和類聲明中同時存在這個注解,那么方法中的會覆蓋類中的設(shè)定。 if (isMethondAnnotation) { authority = m.getAnnotation(Authority.class); } else if (isClzAnnotation) { authority = clazz.getAnnotation(Authority.class); } int code = -1; String msg = ""; if (authority != null) { if (AuthorityType.NoValidate == authority.value()) { // 標(biāo)記為不驗(yàn)證,放行 return true; } else if (AuthorityType.NoAuthority == authority.value()) { // 不驗(yàn)證權(quán)限,驗(yàn)證是否登錄 // TODO: return true; } else { // 驗(yàn)證登錄及權(quán)限 // TODO: code = 1; msg = "驗(yàn)證成功!"; return true; } } // //跳轉(zhuǎn) // String url = ""; // response.getWriter().write("<script>top.location.href='" // + url + "'</script>"); // return false; // 未通過驗(yàn)證,返回提示json Map<String, Object> responseMap = new HashMap<String, Object>(); responseMap.put("code", code); responseMap.put("msg", msg); responseMap.put("params", ""); responseMap.put("rows", ""); String json = new Gson().toJson(responseMap); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); response.getWriter().write(json); return false; } } catch (Exception e) { } } return false; } }
這個類的目的就是在打過Authority
標(biāo)簽的方法及類上,進(jìn)行權(quán)限認(rèn)證。我這里分了三種類型:全部驗(yàn)證、只驗(yàn)證登錄、不驗(yàn)證用來滿足我們的業(yè)務(wù)需求。
這里的返回值可以是 JSON 串,也可以是跳轉(zhuǎn)到相應(yīng)的頁面,來實(shí)現(xiàn)你想要的效果。
四、配置攔截器
<mvc:interceptors> <!-- 權(quán)限認(rèn)證攔截器 --> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="cn.mayongfa.interceptor.AuthorityAnnotationInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
在/WebContent/WEB-INF/springMVC-servlet.xml
文件下的<mvc:interceptors>
節(jié)點(diǎn)配置就行,這里可以配置具體要攔截的 Url。
到這里就完成了權(quán)限驗(yàn)證的工作了,如何使用呢?
使用就非常簡單
因?yàn)槲覀兊臄r截器配置,然后我們在自定義注解的默認(rèn)是驗(yàn)證,所以,我們只需要在類名及方法名上打標(biāo)簽就可以。
當(dāng)然,你完全是可以在攔截器中設(shè)置默認(rèn)就驗(yàn)證所有請求的,接著設(shè)置不驗(yàn)證的請求。
文章的具體的案例地址:http://xiazai.jb51.net/201702/yuanma/SpringDemo_jb51.rar
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java Spring AOP之PointCut案例詳解
- Java aop面向切面編程(aspectJweaver)案例詳解
- Java JDK動態(tài)代理(AOP)用法及實(shí)現(xiàn)原理詳解
- Java動態(tài)代理和AOP應(yīng)用示例
- Java JDK動態(tài)代理(AOP)的實(shí)現(xiàn)原理與使用詳析
- java Spring AOP詳解及簡單實(shí)例
- 圖解JAVA中Spring Aop作用
- Java AOP知識詳細(xì)介紹
- Java SpringBoot整合SpringCloud
- 一篇文章教你將JAVA的RabbitMQz與SpringBoot整合
- Java SpringBoot啟動指定profile的8種方式詳解
- Java SpringBoot在RequestBody中高效的使用枚舉參數(shù)原理案例詳解
- Java SpringBoot實(shí)現(xiàn)AOP
相關(guān)文章
mybatis-plus批量更新updateBatchById問題
這篇文章主要介紹了mybatis-plus批量更新updateBatchById問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Java?C++題解leetcode672燈泡開關(guān)示例
這篇文章主要為大家介紹了Java?C++題解leetcode672燈泡開關(guān)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09使用Spring Security OAuth2實(shí)現(xiàn)單點(diǎn)登錄
在本教程中,我們將討論如何使用Spring Security OAuth和Spring Boot實(shí)現(xiàn)SSO - 單點(diǎn)登錄。感興趣的朋友跟隨小編一起看看吧2019-06-06java線程并發(fā)cyclicbarrier類使用示例
CyclicBarrier類似于CountDownLatch也是個計數(shù)器,不同的是CyclicBarrier數(shù)的是調(diào)用了CyclicBarrier.await()進(jìn)入等待的線程數(shù),當(dāng)線程數(shù)達(dá)到了CyclicBarrier初始時規(guī)定的數(shù)目時,所有進(jìn)入等待狀態(tài)的線程被喚醒并繼續(xù),下面使用示例學(xué)習(xí)他的使用方法2014-01-01Spring Boot配置讀取實(shí)現(xiàn)方法解析
這篇文章主要介紹了Spring Boot配置讀取實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08SpringBoot整合Flyway的方法(數(shù)據(jù)庫版本遷移工具)
這篇文章主要介紹了SpringBoot整合Flyway的方法(數(shù)據(jù)庫版本遷移工具),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06java利用正則表達(dá)式處理特殊字符的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于java利用正則表達(dá)式處理特殊字符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式
這篇文章主要介紹了OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05