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

  1.利用jwt生成token

   a.导入jwt相关包

  

  1. <!-- jwt -->
  2. <dependency>
  3. <groupId>com.nimbusds</groupId>
  4. <artifactId>nimbus-jose-jwt</artifactId>
  5. <version>4.23</version>
  6. </dependency>

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

  

  1. public class TokenUtils {
  2.  
  3. private static final byte[] secret = "geiwodiangasfdjsikolkjikolkijswe".getBytes();
  4.  
  5. //生成一个token
  6. public static String creatToken(String uid) throws JOSEException {
  7.  
  8. Map<String,Object> payloadMap = new HashMap<>();
  9. payloadMap.put("uid", uid);
  10. //生成时间
  11. payloadMap.put("sta", new Date().getTime());
  12. //过期时间
  13. payloadMap.put("exp", new Date().getTime()+1000*60*60*24); //24小时token失效
  14.  
  15. //先建立一个头部Header
  16. JWSHeader jwsHeader = new JWSHeader(JWSAlgorithm.HS256);
  17.  
  18. //建立一个载荷Payload
  19. Payload payload = new Payload(new JSONObject(payloadMap));
  20.  
  21. //将头部和载荷结合在一起
  22. JWSObject jwsObject = new JWSObject(jwsHeader, payload);
  23.  
  24. //建立一个密匙
  25.  
  26. JWSSigner jwsSigner = new MACSigner(secret);
  27.  
  28. //签名
  29. jwsObject.sign(jwsSigner);
  30.  
  31. //生成token
  32. return jwsObject.serialize();
  33. }
  34.  
  35. public static Map<String,Object> valid(String token) throws JOSEException, ParseException {
  36.  
  37. JWSObject jwsObject = JWSObject.parse(token);
  38.  
  39. //获取到载荷
  40. Payload payload=jwsObject.getPayload();
  41.  
  42. //建立一个解锁密匙
  43. JWSVerifier jwsVerifier = new MACVerifier(secret);
  44.  
  45. Map<String, Object> resultMap = new HashMap<>();
  46. //判断token
  47. if (jwsObject.verify(jwsVerifier)) {
  48. resultMap.put("Result", 0);
  49. //载荷的数据解析成json对象。
  50. JSONObject jsonObject = payload.toJSONObject();
  51. resultMap.put("data", jsonObject);
  52.  
  53. //判断token是否过期
  54. if (jsonObject.containsKey("exp")) {
  55. Long expTime = Long.valueOf(jsonObject.get("exp").toString());
  56. Long nowTime = new Date().getTime();
  57. //判断是否过期
  58. if (nowTime > expTime) {
  59. //已经过期
  60. resultMap.clear();
  61. resultMap.put("Result", 2);
  62. }
  63. }
  64. }else {
  65. resultMap.put("Result", 1);
  66. }
  67. return resultMap;
  68.  
  69. }
  70. }

  

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

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

    

  1.    <filter>
  2. <filter-name>AppRequestFilter</filter-name>
  3. <filter-class>com.demo.common.filter.AppRequestFilter</filter-class>
  4. <init-param>
  5. <param-name>excludedRequests</param-name>
  6. <param-value>/app/login</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>AppRequestFilter</filter-name>
  11. <url-pattern>/app/*</url-pattern>
  12. </filter-mapping>

    b.编写AppRequestFilter类

    

  1. public class AppRequestFilter implements Filter{
  2.  
  3. private String excludedRequests;
  4. private String[] excludedRequestArr;
  5.  
  6. @Override
  7. public void init(FilterConfig filterConfig) throws ServletException {
  8. excludedRequests = filterConfig.getInitParameter("excludedRequests");
  9. if(excludedRequests != null && excludedRequests.length() > 0){
  10. excludedRequestArr = excludedRequests.split(",");
  11. }
  12. return;
  13. }
  14.  
  15. @Override
  16. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  17. throws IOException, ServletException {
  18.  
  19. HttpServletRequest req = (HttpServletRequest) request;
  20. HttpServletResponse res = (HttpServletResponse) response;
  21.  
  22. boolean isExcludedRequest = false;
  23. for (String requestStr : excludedRequestArr) {
  24. if (((HttpServletRequest) request).getServletPath().startsWith(requestStr)) {
  25. isExcludedRequest = true;
  26. break;
  27. }
  28. }
  29. if(isExcludedRequest){
  30. chain.doFilter(request, response);
  31. }else{
  32. String token = req.getHeader("app_token");
  33. if(StringUtil.isEmpty(token)){
  34. responseError(res, "token为空!");
  35. return;
  36. }else{
  37. Map<String, Object> validMap;
  38. try {
  39. validMap = TokenUtils.valid(token);
  40. int i = (int) validMap.get("Result");
  41. if (i == 0) {
  42. chain.doFilter(request, response);
  43. } else if (i == 2) {
  44. responseError(res, "token已经过期!");
  45. return;
  46. } else if(i == 1) {
  47. responseError(res, "token无效!");
  48. return;
  49. }
  50. } catch (JOSEException e) {
  51. e.printStackTrace();
  52. } catch (ParseException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56.  
  57. }
  58. }
  59.  
  60. @SuppressWarnings("deprecation")
  61. private void responseError(HttpServletResponse res, String errorMsg) throws IOException {
  62. res.setHeader("content-type", "application/json;charset=UTF-8");
  63. OutputStream outputStream = res.getOutputStream();
  64. JsonResult msg = new JsonResult(false, errorMsg);
  65. IOUtils.write(JSONUtil.toJsonPrettyStr(msg), outputStream);
  66. }
  67.  
  68. @Override
  69. public void destroy() {
  70. return;
  71. }
  72. }

    3.测试类编写

    

  1. @Controller
  2. @RequestMapping(value = "/app")
  3. public class AppLogin {
  4.  
  5. @RequestMapping(value = "/login")
  6. @ResponseBody
  7. public String login(String loginCode, String password){
  8. String token = "";
  9. try {
  10. token = TokenUtils.creatToken(loginCode);
  11. } catch (JOSEException e) {
  12. e.printStackTrace();
  13. }
  14. return token;
  15. }
  16. }
  1. @Controller
  2. @RequestMapping(value = "/app/user")
  3. public class AppSysUserController {
  4.  
  5. @RequestMapping(value = "/getLoginName")
  6. @ResponseBody
  7. public String getLoginName(){
  8. return "admin";
  9. }
  10. }

    4.调用查看结果

    

    

  1.  

利用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. TynSerial自定义对象的序列(还原)

    TynSerial自定义对象的序列(还原) TynSerial是咏南中间件封装的支持数据二进制序列(还原)的类. 对于ORM来说,序列类必须序列(还原)自定义对象. 1)定义一个自定义对象 type ...

  2. Get Argument Values From Linq Expression

    Get Argument Values From Linq Expression If you even find yourself unpacking an expression in C#, yo ...

  3. hadoop格式化

    1.hadoop启动时,namenode没有启动起来 1.删除 namenode产生的临时文件 tmp 2.删除datanode的数据,否则也不行.(如果datanode有数据,请自己备份) ./bi ...

  4. Greenwich.SR2版本的Spring Cloud Feign实例

    前面我们了解了Spring Cloud Ribbon和Hystrix,在使用上它们基本上会成队出现,那么是不是可以把它们组合起来使用?而且我们发现,在服务消费方a-beautiful-client里通 ...

  5. ubuntu 17.04 Tomcat安装

    安装Tomcat分为两步: JDK和Tomcat 安装jdk 1.在oralce官网下载jdk

  6. CSS3 @font-face详细用法

    @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体就不用再为只能使用Web安全字体烦恼了!肯定 ...

  7. iOS-常见问题(错误和警告)

    1.storyboard连线问题    产生原因:将与storyboard关联的属性删除了,但是storyboard中还保持之前所关联的属性.    解决:取消关联就没事了.     2.XXXXX ...

  8. iOS技术面试07:第三方框架

    1ios框架分为:cocoa Touch:UIKit.Foundation.附属框架 Media:OpenGL ES.EAGL.Quartz.Core Animation.Core Audio.    ...

  9. Scratch3架构结构说明

    Scratch3.0整体项目结构比较庞大,对于不同二次开发开始的时候会出现一头雾水,需要先了解下整体框架,可以按需要在指定的源码下进行修改,大致结构如下: 1. scratch-gui: 是基于Rea ...

  10. Spring mvc +ajax 发送邮件

    1.前端页面--form表单提交,通过发送按钮的id=“send”定位DOM,触发ajax请求 <form class="form-horizontal" id=" ...