1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        SpringBoot自定義注解實(shí)現(xiàn)Token校驗(yàn)

        共 9542字,需瀏覽 20分鐘

         ·

        2021-03-03 00:16

        程序員的成長(zhǎng)之路
        互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
        關(guān)注


        閱讀本文大概需要 2.8 分鐘。

        來(lái)自:blog.csdn.net/qq_33556185/article/details/105420205

        1.定義Token的注解,需要Token校驗(yàn)的接口,方法上加上此注解

        import java.lang.annotation.ElementType;
        import java.lang.annotation.Retention;
        import java.lang.annotation.RetentionPolicy;
        import java.lang.annotation.Target;
        @Retention(RetentionPolicy.RUNTIME)
        @Target(ElementType.METHOD)
        public @interface Token {
            boolean validate() default true;
        }

        2.定義LoginUser注解,此注解加在參數(shù)上,用在需要從token里獲取的用戶信息的地方

        import java.lang.annotation.ElementType;
        import java.lang.annotation.Retention;
        import java.lang.annotation.RetentionPolicy;
        import java.lang.annotation.Target;
        @Target(ElementType.PARAMETER)
        @Retention(RetentionPolicy.RUNTIME)
        public @interface LoginUser {
        }

        3.權(quán)限的校驗(yàn)攔截器

        mport com.example.demo.annotation.Token;
        import com.example.demo.entity.User;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.stereotype.Component;
        import org.springframework.web.method.HandlerMethod;
        import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        @Component
        @Slf4j
        public class AuthorizationInterceptor extends HandlerInterceptorAdapter {
            public static final String USER_KEY = "USER_ID";
            public static final String USER_INFO = "USER_INFO";
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                Token annotation;
                if(handler instanceof HandlerMethod) {
                    annotation = ((HandlerMethod) handler).getMethodAnnotation(Token.class);
                }else{
                    return true;
                }
                //沒(méi)有聲明需要權(quán)限,或者聲明不驗(yàn)證權(quán)限
                if(annotation == null || annotation.validate() == false){
                    return true;
                }
                //從header中獲取token
                String token = request.getHeader("token");
                if(token == null){
                    log.info("缺少token,拒絕訪問(wèn)");
                    return false;
                }
                //查詢token信息
        //        User user = redisUtils.get(USER_INFO+token,User.class);
        //        if(user == null){
        //            log.info("token不正確,拒絕訪問(wèn)");
        //            return false;
        //        }
                //token校驗(yàn)通過(guò),將用戶信息放在request中,供需要用user信息的接口里從token取數(shù)據(jù)
                request.setAttribute(USER_KEY, "123456");
                User user=new User();
                user.setId(10000L);
                user.setUserName("[email protected]");
                user.setPhoneNumber("15702911111");
                user.setToken(token);
                request.setAttribute(USER_INFO, user);
                return true;
            }
        }

        4.寫(xiě)參數(shù)的解析器,將登陸用戶對(duì)象注入到接口里

        import com.example.demo.annotation.LoginUser;
        import com.example.demo.entity.User;
        import com.example.demo.interceptor.AuthorizationInterceptor;
        import org.springframework.core.MethodParameter;
        import org.springframework.stereotype.Component;
        import org.springframework.web.bind.support.WebDataBinderFactory;
        import org.springframework.web.context.request.NativeWebRequest;
        import org.springframework.web.context.request.RequestAttributes;
        import org.springframework.web.method.support.HandlerMethodArgumentResolver;
        import org.springframework.web.method.support.ModelAndViewContainer;
        @Component
        public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver
        {
            @Override
            public boolean supportsParameter(MethodParameter methodParameter) {
                return methodParameter.getParameterType().isAssignableFrom(User.class)&&methodParameter.hasParameterAnnotation(LoginUser.class);
            }
            @Override
            public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
                //獲取登陸用戶信息
                Object object = nativeWebRequest.getAttribute(AuthorizationInterceptor.USER_INFO, RequestAttributes.SCOPE_REQUEST);
                if(object == null){
                    return null;
                }
                return (User)object;
            }
        }

        5.配置攔截器和參數(shù)解析器

        import com.example.demo.interceptor.AuthorizationInterceptor;
        import com.example.demo.resolver.LoginUserHandlerMethodArgumentResolver;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.web.method.support.HandlerMethodArgumentResolver;
        import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
        import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
        import java.util.List;
         
        @Configuration
        public class WebMvcConfig implements WebMvcConfigurer {
            @Autowired
            private AuthorizationInterceptor authorizationInterceptor;
            @Autowired
            private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;
         
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**");
            }
         
            @Override
            public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
                argumentResolvers.add(loginUserHandlerMethodArgumentResolver);
            }
        }

        6.測(cè)試類(lèi)

        import com.example.demo.annotation.LoginUser;
        import com.example.demo.annotation.Token;
        import com.example.demo.entity.User;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RequestMethod;
        import org.springframework.web.bind.annotation.RestController;
         
        @RestController
        @RequestMapping(value = "/api")
        @Slf4j
        public class TestController {
            @RequestMapping(value="/test",method = RequestMethod.POST)
            @Token
            public String test(@LoginUser User user){
                System.out.println("需要token才可以訪問(wèn),呵呵……");
                log.info("user:"+user.toString());
                return "test";
            }
            @RequestMapping(value="/noToken",method = RequestMethod.POST)
            public String noToken(){
                System.out.println("不用token就可以訪問(wèn)……");
                return "test";
            }
        }

        至此,自定義注解實(shí)現(xiàn)token校驗(yàn)就大功告成了。
        <END>

        推薦閱讀:

        新功能!微信可以開(kāi)“小號(hào)”了

        神奇的 SQL 之 HAVING → 容易被輕視的主角

        5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「2048」,即可免費(fèi)獲?。?!

        微信掃描二維碼,關(guān)注我的公眾號(hào)

        朕已閱 

        瀏覽 40
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            毛片免费在线观看 | 白丝av在线 | 国产18精品乱码免费看 | 国产亚洲精品久久久久久快乐8 | 插jj视频 | 男女18网站 | 小荡货好紧好爽 | 黄色日比片 | A片在线观看网站 | 国产乱码一区二区三区四区在线 |