在springMVC中使用自定義註解來進行登陸攔截控制

1:java註解使用是至關頻繁,特別是在搭建一些框架時,用到類的反射獲取方法和屬性,用的尤爲多。html

    java中元註解有四個: @Retention     @Target     @Document   @Inheritedjava

 1        @Retention:註解的保留位置         
 2           @Retention(RetentionPolicy.SOURCE)    //註解僅存在於源碼中,在class字節碼文件中不包含
 3          @Retention(RetentionPolicy.CLASS)     //默認的保留策略,註解會在class字節碼文件中存在,但運行時沒法得到,
 4          @Retention(RetentionPolicy.RUNTIME)   //註解會在class字節碼文件中存在,在運行時能夠經過反射獲取到
 5       
 6        @Target:註解的做用目標
 7             
 8         @Target(ElementType.TYPE)   //接口、類、枚舉、註解
 9         @Target(ElementType.FIELD) //字段、枚舉的常量
10         @Target(ElementType.METHOD) //方法
11         @Target(ElementType.PARAMETER) //方法參數
12         @Target(ElementType.CONSTRUCTOR)  //構造函數
13         @Target(ElementType.LOCAL_VARIABLE)//局部變量
14         @Target(ElementType.ANNOTATION_TYPE)//註解
15         @Target(ElementType.PACKAGE) ///包   
16      
17         @Document:說明該註解將被包含在javadoc中
18      
19        @Inherited:說明子類能夠繼承父類中的該註解

建立自定義註解類:web

 1 package com.liveyc.eloan.util;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 /**
 9  * 要求登陸標籤
10  * @author Administrator
11  *
12  */
13 @Target(ElementType.METHOD)
14 @Retention(RetentionPolicy.RUNTIME)
15 public @interface RequireLogin {
16 
17 }

2:編寫攔截器 java中攔截是向下傳遞的 因此要return false不要繼續向下傳遞了spring

 1 package com.liveyc.eloan.base.interceptor;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 
 6 import org.springframework.web.method.HandlerMethod;
 7 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 8 
 9 import com.liveyc.eloan.util.RequireLogin;
10 import com.liveyc.eloan.util.UserContext;
11 
12 /**
13  * 登陸攔截器
14  * 
15  * @author Administrator
16  * 
17  */
18 public class LoginInterceptor extends HandlerInterceptorAdapter {
19 
20     @Override
21     public boolean preHandle(HttpServletRequest request,
22             HttpServletResponse response, Object handler) throws Exception {
23         // 處理handler;
24         if (handler instanceof HandlerMethod) {
25             // 判斷當前method上是否有標籤;
26             HandlerMethod hm = (HandlerMethod) handler;
27             if (hm.getMethodAnnotation(RequireLogin.class) != null
28                     && UserContext.getCurrent() == null) {
29                 // r若是有,判斷當前是否用戶登陸,若是沒有登陸,跳轉到登陸頁面
30                 response.sendRedirect("/login.html");
31                 return false;
32             }
33         }
34         return super.preHandle(request, response, handler);
35     }
36 
37 }

3:在 spring的 xml配置文件中添加mvc

1     <mvc:interceptors>
2         <!-- 配置登陸攔截器 -->
3         <mvc:interceptor>
4             <mvc:mapping path="/**" />
5             <bean class="com.liveyc.eloan.base.interceptor.LoginInterceptor" />
6         </mvc:interceptor>
7     </mvc:interceptors>

4:在springmvc的 controller層 須要登入之後才能訪問的方法中添加自定義註解  @RequireLoginapp

1 @RequireLogin
2 @RequestMapping("personal")
3 public String personal(Model model) {
4     Logininfo current = UserContext.getCurrent();
5     model.addAttribute("userinfo",this.userinfoService.get(current.getId()));
6     model.addAttribute("account", this.accountService.get(current.getId()));
7     return "personal";
8  }

5:啓動項目 開始測試框架

由於沒登入因此直接跳轉到登陸頁面了ide

 

 

訪問一個沒加自定義註解的方法 頁面報錯函數

 

登陸之後 頁面正常訪問 測試

相關文章
相關標籤/搜索