1:springmvc 配置文件中添加攔截器,當然首先要有攔截后交給哪個類處理也要寫上
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.kad.authorization.AuthorizationInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
以上 path=/**代表所有文件夾目錄 .一般這么寫就能攔截所有的請求了
<bean class="com.kad.authorization.AuthorizationInterceptor" /> 這個是處理所攔截的類
2:寫@Authorization接口
就是下邊幾句.這個接口后來總結 就是告訴編譯器這是個注解需要的接口, 訪客訪問到方法時,上邊帶上這個注解的, 在攔截處理方法中能攔截這些帶注解的方法,並做相關處理
就像強制訪客訪問帶了胸牌@Authorization 的方法,要做一次token驗證的步驟,那些不戴@Authorization,又符合攔截規則的,就不做token驗證,實際應用中,比如login register 等服務是不需要驗證token的.當然項目需求不一樣.所設置的規則不一樣
package com.kad.authorization; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 在Controller的方法上使用此注解,該方法在映射時會檢查用戶是否登錄,未登錄返回401錯誤 * @see com.scienjus.authorization.interceptor.AuthorizationInterceptor * @author ScienJus * @date 2015/7/31. */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Authorization { }
3:在處理類中處理添加了@Authorization 注解的 request請求, 一般來說驗證token 正確返回true 錯誤返回false 一般就是401的錯誤
public class AuthorizationInterceptor extends HandlerInterceptorAdapter { @Resource private TokenManager manager; public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //如果不是映射到方法直接通過 if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); //如果注明了@authorization,需要進行驗證,進行驗證返回401錯誤 if (method.getAnnotation(Authorization.class) != null) { //從header中得到token String authorization = request.getParameter("username");//.getHeader(Constants.AUTHORIZATION); //驗證token TokenModel model = manager.getToken(authorization); // 訪問的不是下的,直接跳過 String name = handlerMethod.getBeanType().getPackage().getName(); /* if (name.contains("com.kad.app.action.user")) { return true; } */ if (manager.checkToken(model)) { //如果token驗證成功,將token對應的用戶id存在request中,便於之后注入 request.setAttribute(Constants.CURRENT_USER_ID, model.getUserId()); return true; } else { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } } return true; } }
測試
@Authorization @RequestMapping(value="/AuthTest") public void Test(String username,String password ) { Userinfo _uresinfo = null; String gsonString = null;
客戶端請求先到攔截器處理方法處理一下, 如果是false 直接就返回了,如果正確才會跳到這個Test方法內
