Spring MVC 方法注解攔截器

jopen 10年前發布 | 109K 次閱讀 Spring MVC Web框架

應用場景,在方法級別對本次調用進行鑒權,如api接口中有個用戶唯一標示accessToken,對于有accessToken的每次請求可以在方法加一個攔截器,獲得本次請求的用戶,存放到request或者session域。

python中,之前在python flask中可以使用裝飾器來對方法進行預處理,進行權限處理

先看一個實例,使用@access_required攔截:

@api.route('/post_apply')
@access_required
def apply():
    """
     活動報名
    """
    print '報名者是:'+g.user
    return jsonify(response_data)

實現很簡單:

# 驗證access_token并保存當前用戶到g中
def access_required(f):
    @wraps(f)
    def decorated_func(*args, **kwargs):
        access_token = request.values.get('access_token')
        if access_token == None:
            return error_msg('500', 'access_token required')
        if access_token == "":
            return error_msg('500', 'access_token can not empty')
        if is_access_token(access_token) == False:
            return error_msg('500', 'invalid_access_token')
        return f(*args, **kwargs)
    return decorated_func

 

java中,自定義注解攔截器來實現,在需要的攔截的方法上面加上一個注解@AccessRequired

spring mvc Controller中的使用實例

/**
     * 注解攔截器方法
     * @return
     */
    @RequestMapping(value="/urlinter",method=RequestMethod.GET)
    @AccessRequired
    public @ResponseBody String urlInterceptorTest() {
        return "通過攔截器:user"+request.getAttribute("currUser");
    }

如何實現以上實例呢?

定義一個注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessRequired {

}

搞一個攔截器:

/**
 * 攔截url中的access_token
 * @author Nob
 * 
 */
public class UserAccessApiInterceptor extends HandlerInterceptorAdapter {

    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        AccessRequired annotation = method.getAnnotation(AccessRequired.class);
        if (annotation != null) {
           System.out.println("你遇到了:@AccessRequired");
           String accessToken = request.getParameter("access_token");
            /**
             * Do something
             */
            response.getWriter().write("沒有通過攔截,accessToken的值為:" + accessToken);
        }
        // 沒有注解通過攔截
        return true;
    }
}

在spring mvc配置文件中:

<!-- 攔截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 對所有的請求攔截使用/** ,對某個模塊下的請求攔截使用:/myPath/* -->
            <mvc:mapping path="/**" />
            <ref bean="userAccessInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

    <bean id="userAccessInterceptor"
        class="com.banmacoffee.web.interceptor.UserAccessApiInterceptor">
    </bean>

大功告成,你可以在攔截器里為所欲為,并且把它加載任何你想的Controller 請求的方法上。

來自:http://my.oschina.net/freegeek/blog/300879

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!