springmvc 攔截器與用戶驗證token


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方法內


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM