spring mvc 方法註解攔截器
阿新 • • 發佈:2019-01-24
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 {
}
搞一個攔截器:
在spring mvc配置檔案中:/** * 攔截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; } }
<!-- 攔截器 --> <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 請求的方法上