1. 程式人生 > >spring mvc 方法註解攔截器

spring mvc 方法註解攔截器

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>

注意問題:

    如果你使用了<mvc:resources mapping="/resources/**" location="/resources/" />來配置靜態資源,那麼配置如上攔截器的時候就要使用使用了全域性攔截/**,否則會攔截靜態資源丟擲ResourceHttpRequestHandler cannot be cast to HandlerMethod異常

辦法一:加上攔截路徑字首

<mvc:mapping path="/path/**" />

<!-- 這裡使用一個path前置,如api,否則會攔截靜態資源 -->

辦法二:在自定義攔截器中使用instanceof 過濾ResourceHttpRequestHandler 型別

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