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

猜你喜欢

转载自www.cnblogs.com/zuochanzi/p/10966470.html