要使用jwt必须有相应jar包

maven项目加入依赖

        <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.4.0</version></dependency>

普通web项目  将

java-jwt-3.4.0.jar

导入即可

说一下jwt的作用。可以使服务端和客户端之间的信息传递是无状态的。

进入正题:

1.准备好注解类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*** 免验证注解* @author 少时诵诗书**/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PassToken {boolean required() default true;
}

这个注解是在登录和注册等不需要验证token的时候在接口方法加的

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** token验证* @author 少时诵诗书**/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLoginToken {boolean required() default true;
}

这个注解是需要验证token信息

注解解析:从上面我们新建的两个类上我们可以看到主要的等学习到的就四点

第一:如何创建一个注解

第二:在我们自定义注解上新增@Target注解(注解解释:这个注解标注我们定义的注解是可以作用在类上还是方法上还是属性上面)

第三:在我们自定义注解上新增@Retention注解(注解解释:作用是定义被它所注解的注解保留多久,一共有三种策略,SOURCE 被编译器忽略,CLASS  注解将会被保留在Class文件中,但在运行时并不会被VM保留。这是默认行为,所有没有用Retention注解的注解,都会采用这种策略。RUNTIME  保留至运行时。所以我们可以通过反射去获取注解信息。

第四:boolean required() default true;  默认required() 属性为true

2.准备拦截器验证token

在spring-mvc.xml里面配置

    <mvc:interceptors><mvc:interceptor><mvc:mapping path="${adminPath}/**" /><mvc:exclude-mapping path="${adminPath}/"/><mvc:exclude-mapping path="${adminPath}/login"/><mvc:exclude-mapping path="${adminPath}/sys/menu/tree"/><mvc:exclude-mapping path="${adminPath}/sys/menu/treeData"/><mvc:exclude-mapping path="${adminPath}/oa/oaNotify/self/count"/><bean class="com.xxx.modules.sys.interceptor.LogInterceptor" /></mvc:interceptor><!-- 接口token验证 --><mvc:interceptor><mvc:mapping path="${frontPath}/**" /><bean class="com.xxx.modules.sys.interceptor.TokenIntercetor" /></mvc:interceptor><!-- 手机视图拦截器 --><mvc:interceptor><mvc:mapping path="/**" /><bean class="com.xxx.modules.sys.interceptor.MobileInterceptor" /></mvc:interceptor></mvc:interceptors>

拦截器类

import java.lang.reflect.Method;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.jeeplus.modules.sys.annotation.PassToken;
import com.jeeplus.modules.sys.annotation.UserLoginToken;
import com.jeeplus.modules.sys.service.TokenService;public class TokenIntercetor implements HandlerInterceptor{@Autowiredprivate TokenService tokenService;@Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {// TODO Auto-generated method stub}@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {// TODO Auto-generated method stub}@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {//取出tokenString token=httpServletRequest.getHeader("token");System.out.println(token);//如果不是映射方法直接返回if(!(object instanceof HandlerMethod)){return true;}HandlerMethod handlermethod=(HandlerMethod)object;Method method=handlermethod.getMethod();//如果方法注解了passtoken直接跳过if(method.isAnnotationPresent(PassToken.class)){PassToken passToken=method.getAnnotation(PassToken.class);if(passToken.required()){return true;}}//如果注解了userLoginToken需要验证if(method.isAnnotationPresent(UserLoginToken.class)){UserLoginToken userLoginToken=method.getAnnotation(UserLoginToken.class);//验证if(userLoginToken.required()){if(token==null){throw new RuntimeException("无token信息,请重新登录");}//获取token 信息中useridString userid;try {userid=JWT.decode(token).getAudience().get(0);} catch (JWTDecodeException e) {throw new RuntimeException("401");}//查询用户是否存在if(!userid.equals("123")){//测试用123代替throw new RuntimeException("没有该用户");}//验证密码是否正确JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256("456")).build();try {jwtVerifier.verify(token);} catch (JWTVerificationException e) {throw new RuntimeException("401");}return true;}}return false;}}

3.准备一个生成token的工具类或者service

import org.springframework.stereotype.Service;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
/*** 生成token的业务层* @author 少时诵诗书**/
@Service
public class TokenService {public  String getToken(String userid,String password){String token="";token=JWT.create().withAudience(userid).sign(Algorithm.HMAC256(password));System.out.println(token);return token;}}

5.测试

准备一个登录接口和获取用户信息的接口

import java.util.HashMap;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.jeeplus.common.web.BaseController;
import com.jeeplus.modules.sys.annotation.PassToken;
import com.jeeplus.modules.sys.annotation.UserLoginToken;
import com.jeeplus.modules.sys.service.TokenService;@Controller
@RequestMapping("${frontPath}")
public class TestController extends BaseController{@Autowiredprivate TokenService tokenService;/*** 登录* @return*/@RequestMapping("login")@ResponseBody@PassTokenpublic HashMap<String, Object> login(){HashMap<String, Object> m=new HashMap<String, Object>();String token="";token=tokenService.getToken("123", "456");m.put("status", 200);m.put("token", token);return m;}@RequestMapping("getUserInfo")@ResponseBody@UserLoginTokenpublic String getUserInfo(){return "用户信息以获取";}
}

用postman测试、

登录并获取token

测试请求不加token的访问

服务器抛出异常

加上token的访问

可以了。

以上就是使用jwt方式的接口访问

使用jwt方式的接口访问相关推荐

  1. 接口使用jwt返回token_API接口JWT方式的Token认证(下),客户端(Android)的实现

    上篇文章已经介绍了 JWT 认证在 Laravel 框架服务器上的实现.这篇文章继续介绍 Android 客户端的实现.回顾下 JWT 认证的流程,客户端先提交账号密码进行登录,账号密码验证成功后,服 ...

  2. CrossOrigin注解的方式实现接口的跨域访问

    springMVC接口实现跨域访问: springMVC框架通过@CrossOrigin注解的方式实现接口的跨域访问 java示例代码: package com.jmst.httpservice; i ...

  3. 接口访问次数_系统运行缓慢,CPU 100%,Full GC次数过多,这一招帮你全搞定

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...

  4. directshow c++ 设置 曝光_DirectShow 接口访问相机参数设置方法

    本文档适用于所有适用 directshow 接口访问相机的程序,例如 MATLAB和 Labview 的 ImaqDx 接口.Halcon 的 Directshow 接口等. MATLAB 中,可以通 ...

  5. ABP从入门到精通(4):使用基于JWT标准的Token访问WebApi

    项目:asp.net zero 4.2.0 .net core(1.1) 版本 我们做项目的时候可能会遇到需要提供api给app调用,ABP动态生成的WebApi提供了方便的基于JWT标准的Token ...

  6. rest风格使用两个变量_为什么要用Rest风格,接口应该怎么定义,除了Rest还可用什么方式写接口的?...

    这里是修真院后端小课堂,每篇分享文从 深度思考中的知识点--为什么要用Rest风格,如果不用Rest的话,接口应该怎么定义,在使用Rest风格之前,大家都是用什么方式写接口的? 1.背景介绍 REST ...

  7. php限制接口访问次数_令牌桶限流思路分享(PHP+Redis实现机制)

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...

  8. 孢子java_孢子框架-接口访问层、ESB、微服务API GateWay对比

    标签: 如果从百度去搜索"接口访问层"你会发现主要是.NET里面的技术,叫做IDAL,其实是数据访问层接口.它的主要作用是兼容多种数据库.比如你定义一个标准接口,然后实现改接口的S ...

  9. STM32F427利用FSMC接口访问FPGA的SRAM(1)—— STM32F427启动文件

    该启动文件做好后,才能进行下一步(STM32F427利用FSMC接口访问FPGA的SRAM),所以此文记录如何制作F427的启动文件. 1.参考F407探索者的资料:TFTLCD显示实验.外部SRAM ...

  10. java 接口访问权限_详解Java之路(五) 访问权限控制

    在Java中,所有事物都具有某种形式的访问权限控制. 访问权限的控制等级从最大到最小依次为:public,protected,包访问权限(无关键词)和private. public,protected ...

最新文章

  1. 终于弄明白 i = i++和 i = ++i 的区别了!
  2. 犀牛导出su文件错误插件错误_安利|一款免费插件blender-for-unrealengine
  3. Win7重启后IP地址无效
  4. 三句话讲清楚直接初始化与拷贝初始化
  5. Spark精华问答 | Spark做大规模高性能数值计算可以吗?
  6. 讨论群问题:Linux 下的批量操作,第2种很赞
  7. 使用FontAwesome
  8. python空条件_python – 如何在SQLAlchemy中指定一个条件,其中一个条件要求列为空?...
  9. 10_官方例子程序01
  10. Orchard源码分析(5.3):EndRequest事件处理(DefaultOrchardHost.EndRequest方法)
  11. eclipse离线安装插件的两种方法
  12. c语言山东科技大学答案oj,山东科技大学oj部分题目记答案.doc
  13. jeecg字典表-系统字典
  14. android 魅族扫码,教你扫码登录王者荣耀,支持魅族OPPO华为小米苹果安卓等手机,超简单...
  15. 机器学习的通俗讲解!
  16. c语言中为什么无法打开原文件格式,为什么vs2012无法打开源文件graphics.h和bio
  17. vue显示格式化的json
  18. arm-linux-gcc camke,Window平台基于CMake与linaro交叉编译arm程序
  19. nyoj 1273 宣传墙
  20. yolov3原理+训练损失

热门文章

  1. Fabric.js IText 手动设置斜体
  2. 高盛发布VR/AR研究报告
  3. pg比mysql优势_postgresql比mysql有多少优势
  4. linux自动清除超出的文件,Linux下面自动清理超过指定大小的文件
  5. Temporal Action Proposal Generation with Transformers TAPG transformer论文阅读笔记
  6. 老版本金蝶迷你版9.1升级到金蝶KIS 13.0,升级错误.
  7. 使用Java调用shell脚本时遇到的问题
  8. Mac 升级ruby版本
  9. 转载】强制删除域控制器
  10. electron通过注册表打开软件