Spring mvcメソッド注記ブロック

3583 ワード

アプリケーションシーンは、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="/api/**" />
			<ref bean="userAccessInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

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

注意:
を使用して静的リソースを構成している場合は、上記のようにブロックを構成するときにグローバルブロック/**を使用します.そうしないと、静的リソースをブロックしてResourceHttpRequestHandler cannot be cast to HandlerMethod例外を放出します.
方法1:ブロックパス接頭辞を付ける
<mvc:mapping path="/path/**" />


方法2:カスタムブロッキングでinstanceofを使用してResourceHttpRequestHandlerタイプをフィルタする
大きな成果は、ブロッカーの中でやりたいことをすることができ、Controllerリクエストの方法をロードすることができます.