每個項目都會有權限管理系統
無論你是一個簡單的企業站,還是一個複雜到爆的平台級項目,都會涉及到用戶登入、權限管理這些必不可少的業務邏輯。有人說,企業站需要什麼權限管理阿?那行吧,你那可能叫靜態頁面,就算這樣,但你一定也會有後台管理及登入功能。
每個專案都會有這些幾乎一樣的業務邏輯,我們能不能把他們做成通用的系統呢?
AOP 實現使用者權限驗證
AOP 在實際專案中運用的場景主要有權限管理(Authority Management)、事務管理(Transaction Management)、安全管理(Security)、日誌管理(Logging)和偵錯管理(Debugging)等。
所以,權限驗證正好我們可以使用 AOP 直接實現。具體你專案中權限怎麼管理,管理的粒度是什麼等級這些完全取決於專案需要,這裡完全不做任何的討論。
先說思路:利用自訂註解及攔截器來在你需要的時候,進行你需要的一些權限認證。這裡仍涉及到的有enum(枚舉)、annotation(自訂註解)及攔截器相關知識,廢話不多說,直接開寫程式碼。
開始擼一下程式碼
**一、建立AuthorityType.java枚舉類
public enum AuthorityType { // 登录和权限都验证 默认 Validate, // 不验证 NoValidate, // 不验证权限 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 { // 默认验证 AuthorityType value() default AuthorityType.Validate; }
三、再建一個AuthorityAnnotationInterceptor.javano
reeereee
,進行權限認證。我這裡分了三種類型:全部驗證、只驗證登入、不驗證用來滿足我們的業務需求。 這裡的回傳值可以是 JSON 串,也可以是跳到對應的頁面,來實現你想要的效果。 四、設定攔截器/** * 权限认证拦截器 * */ 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; // 如果方法和类声明中同时存在这个注解,那么方法中的会覆盖类中的设定。 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()) { // 标记为不验证,放行 return true; } else if (AuthorityType.NoAuthority == authority.value()) { // 不验证权限,验证是否登录 // TODO: return true; } else { // 验证登录及权限 // TODO: code = 1; msg = "验证成功!"; return true; } } // //跳转 // String url = ""; // response.getWriter().write("<script>top.location.href='" // + url + "'</script>"); // return false; // 未通过验证,返回提示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; } }在/WebContent/WEB-INF/springMVC-servlet.xml檔案下的