zoukankan      html  css  js  c++  java
  • SB-Token-Jwt


    ######post######http://localhost:8080/login?username=1&password=1
    ################token:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTA0ODg1NDUsInVzZXJuYW1lIjoiMSJ9.Tk6S2yECmtfLbk8_fE9Bw477rNuUMh1fNdFsI4BlmEo
    **********************************************************************************************
    ######get######http://localhost:8080/api/test
    ######Header[token:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTA0ODg1NDUsInVzZXJuYW1lIjoiMSJ9.Tk6S2yECmtfLbk8_fE9Bw477rNuUMh1fNdFsI4BlmEo]


    1、pom.xml

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.10.3</version>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
      </dependency>

    2、SysUser

      import lombok.Data;

      @Data
      public class SysUser {
        private String username;
        private String password;
      }

    3、JwtUtil

      import com.auth0.jwt.JWT;
      import com.auth0.jwt.JWTVerifier;
      import com.auth0.jwt.algorithms.Algorithm;
      import com.auth0.jwt.interfaces.DecodedJWT;
      import javax.servlet.http.HttpServletRequest;
      import java.util.Date;


      public class JwtUtil {

      // Token过期时间30分钟
      public static final long EXPIRE_TIME = 30 * 60 * 1000;

      /* *
      * @Author lsc
      * <p> 校验token是否正确 </p>
      * @Param token
      * @Param username
      * @Param secret
      * @Return boolean
      */
      public static boolean verify(String token, String username, String secret) {
        try {
          // 设置加密算法
          Algorithm algorithm = Algorithm.HMAC256(secret);
          JWTVerifier verifier = JWT.require(algorithm)
          .withClaim("username", username).build();
          // 效验TOKEN
          DecodedJWT jwt = verifier.verify(token);
          return true;
        } catch (Exception exception) {
          return false;
        }
      }

      /* *
      * @Author lsc
      * <p>生成签名,30min后过期 </p>
      * @Param [username, secret]
      * @Return java.lang.String
      */
      public static String sign(String username, String secret) {
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        Algorithm algorithm = Algorithm.HMAC256(secret);
        // 附带username信息
        return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm);

      }

      /* *
      * @Author lsc
      * <p> 获得用户名 </p>
      * @Param [request]
      * @Return java.lang.String
      */
      public static String getUserNameByToken(HttpServletRequest request) {
        String token = request.getHeader("token");
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("username").asString();
        }
      }


    4、Service
      sysUserService

      @Service
      public class SysUserService {
        public String getPassword(){
        return "1";
        }
      }


    5、Interceptor&Config
      public class JwtInterceptor implements HandlerInterceptor {

      @Autowired
      SysUserService sysUserService;

      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 从 http 请求头中取出 token
        String token = request.getHeader("token");
        // 如果不是映射到方法直接通过
        if(!(handler instanceof HandlerMethod)){
          return true;
        }
        if (token != null){
          String username = JwtUtil.getUserNameByToken(request);
          // 这边拿到的 用户名 应该去数据库查询获得密码,简略,步骤在service直接获取密码
          boolean result = JwtUtil.verify(token,username,sysUserService.getPassword());
          if(result){
            System.out.println("通过拦截器");
            return true;
          }
        }
      return false;
      }

      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

      }

      @Override
      public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

      }
     }

      @Configuration
      public class InterceptorConfig implements WebMvcConfigurer {

      /* *
      * @Author lsc
      * <p> 设置拦截路径 </p>
      * @Param [registry]
      * @Return void
      */
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authenticationInterceptor()).addPathPatterns("/**").excludePathPatterns("/login");
      }
      /* *
      * @Author lsc
      * <p> 将拦截器注入context </p>
      * @Param []
      * @Return com.zszxz.jwt.interceptor.JwtInterceptor
      */
      @Bean
      public JwtInterceptor authenticationInterceptor() {
        return new JwtInterceptor();
      }

      /* *
      * @Author lsc
      * <p>跨域支持 </p>
      * @Param [registry]
      * @Return void
      */
      @Override
      public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH", "OPTIONS", "HEAD")
        .maxAge(3600 * 24);
        }
      }


    6、Controller


      @Controller
      public class SysUserController {

        // @RequestMapping(value = "/login")
        @RequestMapping("/login")
        @ResponseBody
        public Map<String, Object> login(SysUser sysUser){
          Map<String, Object> map = new HashMap<>();
          String username = sysUser.getUsername();
          String password = sysUser.getPassword();
          // 省略 账号密码验证
          // 验证成功后发送token
          String token = JwtUtil.sign(username,password);
          if (token != null){
            map.put("code", "200");
            map.put("message","认证成功");
            map.put("token", token);
            return map;
          }
          map.put("code", "403");
          map.put("message","认证失败");
          return map;
          }
      }

      @RestController
      public class TestController {

        @RequestMapping(value = "/api/test")
        public String get(){

        return "pwd:1";
        }
      }

    7、@SpringBootApplication
      public class JwttestApplication {

        public static void main(String[] args) {
          SpringApplication.run(JwttestApplication.class, args);
        }

      }

  • 相关阅读:
    .Net EF中DbContext动态生成DbSet
    .net core 3.0 中间件或过滤器中读取post请求body方法
    Asp.Net Core 5 WebAPI发布后的Swagger不显示问题
    .net Core 使用Swagger 让某些接口不显示在文档
    C# Request.InputStream 读取输入流为空的原因处理
    ASP.NET 中的缓存
    缓存依赖(文件、数据库)
    NLTK基本使用
    NLTK基本使用
    NLTK的基本使用
  • 原文地址:https://www.cnblogs.com/smallfa/p/12967348.html
Copyright © 2011-2022 走看看