前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证。

  1.利用jwt生成token

   a.导入jwt相关包

  

        <!-- jwt -->
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>4.23</version>
</dependency>

   b.编写生成token的工具类TokenUtils

  

public class TokenUtils {

    private static final byte[] secret = "geiwodiangasfdjsikolkjikolkijswe".getBytes();

    //生成一个token
public static String creatToken(String uid) throws JOSEException { Map<String,Object> payloadMap = new HashMap<>();
payloadMap.put("uid", uid);
//生成时间
payloadMap.put("sta", new Date().getTime());
//过期时间
payloadMap.put("exp", new Date().getTime()+1000*60*60*24); //24小时token失效 //先建立一个头部Header
JWSHeader jwsHeader = new JWSHeader(JWSAlgorithm.HS256); //建立一个载荷Payload
Payload payload = new Payload(new JSONObject(payloadMap)); //将头部和载荷结合在一起
JWSObject jwsObject = new JWSObject(jwsHeader, payload); //建立一个密匙 JWSSigner jwsSigner = new MACSigner(secret); //签名
jwsObject.sign(jwsSigner); //生成token
return jwsObject.serialize();
} public static Map<String,Object> valid(String token) throws JOSEException, ParseException { JWSObject jwsObject = JWSObject.parse(token); //获取到载荷
Payload payload=jwsObject.getPayload(); //建立一个解锁密匙
JWSVerifier jwsVerifier = new MACVerifier(secret); Map<String, Object> resultMap = new HashMap<>();
//判断token
if (jwsObject.verify(jwsVerifier)) {
resultMap.put("Result", 0);
//载荷的数据解析成json对象。
JSONObject jsonObject = payload.toJSONObject();
resultMap.put("data", jsonObject); //判断token是否过期
if (jsonObject.containsKey("exp")) {
Long expTime = Long.valueOf(jsonObject.get("exp").toString());
Long nowTime = new Date().getTime();
//判断是否过期
if (nowTime > expTime) {
//已经过期
resultMap.clear();
resultMap.put("Result", 2);
}
}
}else {
resultMap.put("Result", 1);
}
return resultMap; }
}

  

    2.对于移动端所有请求进行过滤

    a.在web.xml中配置相关过滤器(对所有请求含有/app开头的进行拦截,除了/app/login)

    

   <filter>
<filter-name>AppRequestFilter</filter-name>
<filter-class>com.demo.common.filter.AppRequestFilter</filter-class>
<init-param>
<param-name>excludedRequests</param-name>
<param-value>/app/login</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AppRequestFilter</filter-name>
<url-pattern>/app/*</url-pattern>
</filter-mapping>

    b.编写AppRequestFilter类

    

public class AppRequestFilter implements Filter{

    private String excludedRequests;
private String[] excludedRequestArr; @Override
public void init(FilterConfig filterConfig) throws ServletException {
excludedRequests = filterConfig.getInitParameter("excludedRequests");
if(excludedRequests != null && excludedRequests.length() > 0){
excludedRequestArr = excludedRequests.split(",");
}
return;
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response; boolean isExcludedRequest = false;
for (String requestStr : excludedRequestArr) {
if (((HttpServletRequest) request).getServletPath().startsWith(requestStr)) {
isExcludedRequest = true;
break;
}
}
if(isExcludedRequest){
chain.doFilter(request, response);
}else{
String token = req.getHeader("app_token");
if(StringUtil.isEmpty(token)){
responseError(res, "token为空!");
return;
}else{
Map<String, Object> validMap;
try {
validMap = TokenUtils.valid(token);
int i = (int) validMap.get("Result");
if (i == 0) {
chain.doFilter(request, response);
} else if (i == 2) {
responseError(res, "token已经过期!");
return;
} else if(i == 1) {
responseError(res, "token无效!");
return;
}
} catch (JOSEException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
} }
} @SuppressWarnings("deprecation")
private void responseError(HttpServletResponse res, String errorMsg) throws IOException {
res.setHeader("content-type", "application/json;charset=UTF-8");
OutputStream outputStream = res.getOutputStream();
JsonResult msg = new JsonResult(false, errorMsg);
IOUtils.write(JSONUtil.toJsonPrettyStr(msg), outputStream);
} @Override
public void destroy() {
return;
}
}

    3.测试类编写

    

@Controller
@RequestMapping(value = "/app")
public class AppLogin { @RequestMapping(value = "/login")
@ResponseBody
public String login(String loginCode, String password){
String token = "";
try {
token = TokenUtils.creatToken(loginCode);
} catch (JOSEException e) {
e.printStackTrace();
}
return token;
}
}
@Controller
@RequestMapping(value = "/app/user")
public class AppSysUserController { @RequestMapping(value = "/getLoginName")
@ResponseBody
public String getLoginName(){
return "admin";
}
}

    4.调用查看结果

    

    

												

利用jwt生成token,用于http请求身份验证的更多相关文章

  1. 国服最强JWT生成Token做登录校验讲解,看完保证你学会!

    转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...

  2. 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分

    原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...

  3. Token:服务端身份验证的流行方案【转】

    01- 身份认证 服务端提供资源给客户端,但是某些资源是有条件的.所以服务端要能够识别请求者的身份,然后再判断所请求的资源是否可以给请求者. token是一种身份验证的机制,初始时用户提交账号数据给服 ...

  4. Token:服务端身份验证的流行方案

    01- 身份认证 服务端提供资源给客户端,但是某些资源是有条件的.所以服务端要能够识别请求者的身份,然后再判断所请求的资源是否可以给请求者. token是一种身份验证的机制,初始时用户提交账号数据给服 ...

  5. tp5使用jwt生成token,做api的用户认证

    首先 composer 安装  firebase/php-jwt github:https://github.com/firebase/php-jwt composer require firebas ...

  6. JWT生成token及过期处理方案

    业务场景 在前后分离场景下,越来越多的项目使用token作为接口的安全机制,APP端或者WEB端(使用VUE.REACTJS等构建)使用token与后端接口交互,以达到安全的目的.本文结合stacko ...

  7. JWT生成token

    1.JWT简介 JSON Web Token 简称JWT.一个JWT实际上就是一个字符串,它由三部分组成,头部.载荷与签名.JWT生成的token是这样的 2.Json Web Token(JWT)生 ...

  8. .NET6 JWT(生成Token令牌)

    一.Net 6环境下的.net core项目里如何使用JWT. 第一步,在Nuget引入JWT.Microsoft.AspNetCore.Authentication.JwtBearer这两个NuGe ...

  9. 使用 JWT 生成 Token 代码示例

    JSON Web Token,简称 JWT, 是一个开放的标准(RFC 7519),它定义了以一种紧凑的.自包含的 JSON 对象在各方之间安全传输信息的方式.该信息含有数字签名,可以被验证和信任. ...

随机推荐

  1. 了解有关 in_memory 工作空间的详细信息

    ArcGIS 提供了一个可写入输出要素类和表的内存工作空间.作为将地理处理输出写入磁盘上的某个位置或网络位置的备选方案,可将输出写入内存工作空间中.通常,将数据写入内存工作空间要明显快于写入其他格式( ...

  2. mybatis bind标签

    开门见山的说,平时写模糊查询,一直用${name},例如: select * from table where name like '%${name}%' 后来知道了,这样写可能会引发sql注入,于是 ...

  3. 【Java】浅谈Java内部类(转载)

    说得挺细的,不是泛泛而谈.https://blog.csdn.net/weixin_42762133/article/details/82890555

  4. 治理Go模块 服务治理 中台业务 Golang的net.Conn接口,double close

    小结: 1.中台业务 前台业务 快车.专车.顺风车,在滴滴这些业务线叫做前台服务,他们有一些共同的特性,都有司机信息,订单的状态,收银,账号等等这些业务逻辑,我们会把专门的业务逻辑集合起来,形成专职的 ...

  5. keras Model 1 入门篇

    1 入门 2 多个输入和输出 3 共享层 最近在学习keras,它有一些实现好的特征提取的模型:resNet.vgg.而且是带权重的.用来做特诊提取比较方便 首先要知道keras有两种定义模型的方式: ...

  6. [webpack]深入理解proxy代理

    1.一个基本的代理 module.exports = { //... devServer: { proxy: { '/api': 'http://localhost:3000' } } }; /api ...

  7. main方法的详解

    格式 * public static void main(String[] args) {} 针对格式的解释 public 被jvm调用,访问权限足够大. static 被jvm调用,不用创建对象,直 ...

  8. 阶段5 3.微服务项目【学成在线】_day18 用户授权_19-微服务之间认证-Feign 拦截器

    4.2 Feign 拦截器 4.2.1 定义Feign拦截器 微服务之间使用feign进行远程调用,采用feign拦截器实现远程调用携带JWT. 在common工程添加依赖: <dependen ...

  9. java获取中文汉字的所有拼音

    java获取中文汉字的所有拼音   中文汉字可能有很多读音,java中分别用1,2,3,4来区别,例如“作”字,就有三个读音,zuo1,zuo2,zuo4. java获取汉字读音拼音代码如下所示: S ...

  10. Django之中间件、缓存以及信号

    Django之中间件 中间件执行流程 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通 ...