• 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方法内
  • 相关阅读:
    IO(文件)处理
    集合 (set) 的增删改查及 copy()方法
    字典 (dict) 的增删改查及其他方法
    列表(List) 的增删改查及其他方法
    细数Python中的数据类型以及他们的方法
    CCNA基础 IP地址子网划分
    [转] SSH原理与运用(2):远程操作与端口转发
    记俩次连续失误操作造成的数据丢失损坏解决
    CentOS 下 MySQL DateBasic 抢救
    China Mobile 免流原理
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/10966470.html
Copyright © 2020-2023  润新知