Spring MVC 方法注解攔截器
應用場景,在方法級別對本次調用進行鑒權,如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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!