每個(gè)項(xiàng)目都會(huì)有權(quán)限管理系統(tǒng)
無(wú)論你是一個(gè)簡(jiǎn)單的企業(yè)站,還是一個(gè)復(fù)雜到爆的平臺(tái)級(jí)項(xiàng)目,都會(huì)涉及到用戶登錄、權(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)用戶權(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ō),直接開寫代碼。
開始擼一下代碼
**一、建立AuthorityType.java枚舉類
public enum AuthorityType { // 登錄和權(quán)限都驗(yàn)證 默認(rèn) Validate, // 不驗(yàn)證 NoValidate, // 不驗(yàn)證權(quán)限 NoAuthority;}這個(gè)枚舉類的作用,依然是使自定義注解用起來(lái)爽到還想要。
二、新建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)@Documentedpublic @interface Authority { // 默認(rèn)驗(yàn)證 AuthorityType value() default AuthorityType.Validate;} 三、再建一個(gè)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í)存在這個(gè)注解,那么方法中的會(huì)覆蓋類中的設(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è)類的目的就是在打過(guò)Authority標(biāo)簽的方法及類上,進(jìn)行權(quán)限認(rèn)證。我這里分了三種類型:全部驗(yàn)證、只驗(yàn)證登錄、不驗(yàn)證用來(lái)滿足我們的業(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)證,所以,我們只需要在類名及方法名上打標(biāo)簽就可以。

當(dāng)然,你完全是可以在攔截器中設(shè)置默認(rèn)就驗(yàn)證所有請(qǐng)求的,接著設(shè)置不驗(yàn)證的請(qǐng)求。
文章的具體的案例地址:http://xiazai.VeVB.COm/201702/yuanma/SpringDemo_jb51.rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選