一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Java之Spring AOP 實(shí)現(xiàn)用戶權(quán)限驗(yàn)證

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

2020-08-02 11:56Mafly Java教程

本篇文章主要介紹了Java之Spring AOP 實(shí)現(xiàn)用戶權(quán)限驗(yàn)證,用戶登錄、權(quán)限管理這些是必不可少的業(yè)務(wù)邏輯,具有一定的參考價(jià)值,有興趣的可以了解一下。

每個(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ō),直接開(kāi)寫(xiě)代碼。

開(kāi)始擼一下代碼

**一、建立AuthorityType.java枚舉類(lèi)

?
1
2
3
4
5
6
7
8
9
10
11
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)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
 * 權(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)滿足我們的業(yè)務(wù)需求。

這里的返回值可以是 JSON 串,也可以是跳轉(zhuǎn)到相應(yīng)的頁(yè)面,來(lái)實(shí)現(xiàn)你想要的效果。

四、配置攔截器

?
1
2
3
4
5
6
7
<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)簽就可以。

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

當(dāng)然,你完全是可以在攔截器中設(shè)置默認(rèn)就驗(yàn)證所有請(qǐng)求的,接著設(shè)置不驗(yàn)證的請(qǐng)求。

文章的具體的案例地址:SpringDemo.rar

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/mafly/p/spring_authority.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品久久7777777 | 2020精品极品国产色在线观看 | 美女扒开胸罩露出胸大乳 | 国产亚洲综合成人91精品 | 情趣内衣情趣玩具play | 日本三级在丈面前被耍了 | 久久re视频精品538在线 | 性满足久久久久久久久 | 精选国产AV精选一区二区三区 | 91久久福利国产成人精品 | 精品免费视在线观看 | 免费岛国片| 欧美yw193.c㎝在线观看 | 亚洲精品影视 | 亚洲区视频在线观看 | 三星w699 | 日韩亚洲欧美理论片 | 亚洲国产精品久久丫 | 欧亚精品一区二区三区 | 久久伊人精品青青草原2021 | 高清不卡一区 | 大肥臀风间由美 中文字幕 大东北chinesexxxx露脸 | 91po国产在线高清福利 | 青草视频在线观看免费视频 | china中国小帅gayxnxx | 国产精品 视频一区 二区三区 | 香蕉久久一区二区三区啪啪 | 91制片厂制作果冻传媒2021 | 国内外精品免费视频 | 久久 这里只精品 免费 | 青青青青在线视频 | 日本人成动漫网站在线观看 | www.久久精品视频 | 私人家庭影院5577 | 亚洲ⅴa偷拍在线影院 | 奇米影视中文字幕 | 91av免费在线观看 | 成人亚洲欧美综合 | 精品久久久久久 | 华人亚洲欧美精品国产 | 双性太子 |