Java之Spring AOP 實(shí)現(xiàn)用戶(hù)權(quán)限驗(yàn)證
每個(gè)項(xiàng)目都會(huì)有權(quán)限管理系統(tǒng)
無(wú)論你是一個(gè)簡(jiǎn)單的企業(yè)站,還是一個(gè)復(fù)雜到爆的平臺(tái)級(jí)項(xiàng)目,都會(huì)涉及到用戶(hù)登錄、權(quán)限管理這些必不可少的業(yè)務(wù)邏輯。有人說(shuō),企業(yè)站需要什么權(quán)限管理阿?那行吧,你那可能叫靜態(tài)頁(yè)面,就算這樣,但你肯定也會(huì)有后臺(tái)管理及登錄功能。
每個(gè)項(xiàng)目中都會(huì)有這些幾乎一樣的業(yè)務(wù)邏輯,我們能不能把他們做成通用的系統(tǒng)呢?
AOP 實(shí)現(xiàn)用戶(hù)權(quán)限驗(yàn)證
AOP 在實(shí)際項(xiàng)目中運(yùn)用的場(chǎng)景主要有權(quán)限管理(Authority Management)、事務(wù)管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和調(diào)試管理(Debugging)等。
所以,權(quán)限驗(yàn)證正好我們可以使用 AOP 來(lái)直接實(shí)現(xiàn)。具體你項(xiàng)目中權(quán)限怎么管理,管理的粒度是什么級(jí)別這些完全取決于項(xiàng)目需要,這里完全不做任何的討論。
先說(shuō)思路:利用自定義注解及攔截器來(lái)在你需要的時(shí)候,進(jìn)行你需要的一些權(quán)限認(rèn)證。這里依然涉及到的有enum(枚舉)
、annotation(自定義注解)
及攔截器相關(guān)知識(shí),廢話不多說(shuō),直接開(kāi)寫(xiě)代碼。
開(kāi)始擼一下代碼
**一、建立AuthorityType.java
枚舉類(lèi)
public enum AuthorityType { // 登錄和權(quán)限都驗(yàn)證 默認(rèn) Validate, // 不驗(yàn)證 NoValidate, // 不驗(yàn)證權(quán)限 NoAuthority; }
這個(gè)枚舉類(lèi)的作用,依然是使自定義注解用起來(lái)爽到還想要。
二、新建Authority.java
自定義注解類(lèi)
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; }
三、再建一個(gè)AuthorityAnnotationInterceptor.java
類(lèi)
/** * 權(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; // 如果方法和類(lèi)聲明中同時(shí)存在這個(gè)注解,那么方法中的會(huì)覆蓋類(lèi)中的設(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; // 未通過(guò)驗(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; } }
這個(gè)類(lèi)的目的就是在打過(guò)Authority
標(biāo)簽的方法及類(lèi)上,進(jìn)行權(quán)限認(rèn)證。我這里分了三種類(lèi)型:全部驗(yàn)證、只驗(yàn)證登錄、不驗(yàn)證用來(lái)滿(mǎn)足我們的業(yè)務(wù)需求。
這里的返回值可以是 JSON 串,也可以是跳轉(zhuǎn)到相應(yīng)的頁(yè)面,來(lái)實(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)證的工作了,如何使用呢?
使用就非常簡(jiǎn)單
因?yàn)槲覀兊臄r截器配置,然后我們?cè)谧远x注解的默認(rèn)是驗(yàn)證,所以,我們只需要在類(lèi)名及方法名上打標(biāo)簽就可以。
當(dāng)然,你完全是可以在攔截器中設(shè)置默認(rèn)就驗(yàn)證所有請(qǐng)求的,接著設(shè)置不驗(yàn)證的請(qǐng)求。
文章的具體的案例地址:http://xiazai.jb51.net/201702/yuanma/SpringDemo_jb51.rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java Spring AOP之PointCut案例詳解
- Java aop面向切面編程(aspectJweaver)案例詳解
- Java JDK動(dòng)態(tài)代理(AOP)用法及實(shí)現(xiàn)原理詳解
- Java動(dòng)態(tài)代理和AOP應(yīng)用示例
- Java JDK動(dòng)態(tài)代理(AOP)的實(shí)現(xiàn)原理與使用詳析
- java Spring AOP詳解及簡(jiǎn)單實(shí)例
- 圖解JAVA中Spring Aop作用
- Java AOP知識(shí)詳細(xì)介紹
- Java SpringBoot整合SpringCloud
- 一篇文章教你將JAVA的RabbitMQz與SpringBoot整合
- Java SpringBoot啟動(dòng)指定profile的8種方式詳解
- Java SpringBoot在RequestBody中高效的使用枚舉參數(shù)原理案例詳解
- Java SpringBoot實(shí)現(xiàn)AOP
相關(guān)文章
mybatis-plus批量更新updateBatchById問(wèn)題
這篇文章主要介紹了mybatis-plus批量更新updateBatchById問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java?C++題解leetcode672燈泡開(kāi)關(guān)示例
這篇文章主要為大家介紹了Java?C++題解leetcode672燈泡開(kāi)關(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類(lèi)使用示例
CyclicBarrier類(lèi)似于CountDownLatch也是個(gè)計(jì)數(shù)器,不同的是CyclicBarrier數(shù)的是調(diào)用了CyclicBarrier.await()進(jìn)入等待的線程數(shù),當(dāng)線程數(shù)達(dá)到了CyclicBarrier初始時(shí)規(guī)定的數(shù)目時(shí),所有進(jìn)入等待狀態(tài)的線程被喚醒并繼續(xù),下面使用示例學(xué)習(xí)他的使用方法2014-01-01Spring Boot配置讀取實(shí)現(xiàn)方法解析
這篇文章主要介紹了Spring Boot配置讀取實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot整合Flyway的方法(數(shù)據(jù)庫(kù)版本遷移工具)
這篇文章主要介紹了SpringBoot整合Flyway的方法(數(shù)據(jù)庫(kù)版本遷移工具),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Java進(jìn)程cpu頻繁100%問(wèn)題解決方案
這篇文章主要介紹了Java進(jìn)程cpu頻繁100%問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10java利用正則表達(dá)式處理特殊字符的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于java利用正則表達(dá)式處理特殊字符的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式
這篇文章主要介紹了OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05