国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Java之Spring AOP 實(shí)現(xiàn)用戶權(quán)限驗(yàn)證

2019-11-26 13:09:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

每個(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)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 白水县| 南乐县| 寿宁县| 井陉县| 宽甸| 拜城县| 长垣县| 阿图什市| 五原县| 民丰县| 云浮市| 眉山市| 永吉县| 香河县| 塔城市| 临夏县| 柘荣县| 南充市| 土默特左旗| 运城市| 荆州市| 广宁县| 册亨县| 镇坪县| 历史| 盐池县| 宝兴县| 五河县| 舟山市| 五常市| 昌吉市| 西华县| 饶河县| 湖南省| 泗阳县| 陆川县| 张家界市| 灌阳县| 来凤县| 惠州市| 玉环县|