Token

流程: 1.建立token工具类,先编辑token签名sign():设置超时时长、token秘钥。 2.配置拦截器类,拦截器中重写preHandle()方法,对每次请求进行自定义的拦截操作。 3.建立配置类:定义拦截与不拦截的接口信息。

页面请求登录接口→登录成功后,返回登录信息+token秘钥给前端→前端记住密钥信息,并赋予每个接口(例:在每个接口访问时将秘钥信息放置于headers中的参数下)→拦截器接到请求,从headers获取token密钥进行匹配,通过则继续访问,不通过则返回提示信息。

1..建立token工具类,先编辑token签名sign():设置超时时长、token秘钥。

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import lombok.extern.slf4j.Slf4j;
​
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
​
@Slf4j
public class JwtUtil {/*** 过期时间*/private static final long EXPIRE_TIME = 15 * 60 * 1000;/*** token秘钥*/private static final String TOKEN_SECRET = "c369a1e4-43ee-4e1e-b130-2b952f1ba9ad";
​/*** 签名方法* @Param userName  userName* @Param role  role* @return String role*/public static String sign(String userName, String role) {log.info("sign begin.");try {// 过期时间Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);// 秘钥和加密算法Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);// headersMap<String, Object> herders = new HashMap<>(2);herders.put("typ", "JWT");herders.put("alg", "HS256");log.info("sign end.");return JWT.create().withHeader(herders).withClaim("userName", userName).withClaim("role", role).withExpiresAt(date).sign(algorithm);} catch (UnsupportedEncodingException exception) {exception.printStackTrace();log.info("sign error.");return exception.getMessage();}}
​/*** token 校验方法* @Param userName  userName* @return String role*/public static boolean verify(String token) {log.info("verify begin.");try {Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);JWTVerifier verifier = JWT.require(algorithm).build();verifier.verify(token);log.info("verify end.");return true;} catch (UnsupportedEncodingException exception) {log.info("verify error.");exception.printStackTrace();return false;}}
}

2.controller层登录操作中设置登录校验及token插入:

/*** @program: smartOperationTest* @description: 用户操作* @author: 作者名字* @create: 2021-07-15 10:37**/
@Controller
@RequestMapping("/user")
@Api("userActionController")
@CrossOrigin(value = "*", maxAge = 3600)
@Slf4j
public class UserActionController {
​@AutowiredUserInfoServiceImpl userInfoService;
​@RequestMapping(value = "/login", method = RequestMethod.GET)@ApiOperation(value = "登录", notes = "")@ResponseBodypublic CommonResultBO userLogin(@RequestParam() String username, @RequestParam() String password) {CommonResultBO resultBO = userInfoService.getUserInfo(username, password);Integer statusCode = resultBO.getStatusCode();if (statusCode == 200) {// 登录校验通过则插入token信息UserInfo userInfo = (UserInfo)resultBO.getData();String token = JwtUtil.sign(username, userInfo.getRole());resultBO.setData(token);return resultBO;}resultBO.setData("");resultBO.setStatusCode(1);resultBO.setStatusMessage("token failed");return resultBO;}
}

3.设置拦截器

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
​
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
/*** @program: smartOperationTest* @description: 拦截器* @author: 作者名字* @create: 2021-07-15 16:20**/
@Component
@Slf4j
public class TokenInterceptor implements HandlerInterceptor {
​public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws IOException {log.info("preHandle begin.");response.setCharacterEncoding("utf-8");String token = request.getHeader("accessToken");log.info("preHandle begin TOKEN: {}." + token);// token通过验证 返回true 继续访问if (null != token) {boolean result = JwtUtil.verify(token) ;if (result) {log.info("preHandle end.");return true;}}// token验证不通过 返回失败提示CommonResultBO commonResultBO = CommonResultBO.init(null, -1, "failed", "token invalid");response.getWriter().write(JSONObject.toJSONString(commonResultBO));log.info("preHandle end.");return false;}
}

4.建立配置类,明确拦截与不拦截的接口:/*拦截一层路径,/**拦截/后全布路径。

import com.hawk.smartoperationtest.common.TokenInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
​
/*** @program: smartOperationTest* @description: 自定义拦截器配置* @author: 作者名字* @create: 2021-07-15 16:48**/
@Configuration
@Slf4j
public class MvcConfig extends WebMvcConfigurationSupport {
​@AutowiredTokenInterceptor tokenInterceptor;
​@Overrideprotected void addInterceptors(InterceptorRegistry registry) {//添加自定义拦截器log.info("addInterceptors begin.");InterceptorRegistration patterns = registry.addInterceptor(tokenInterceptor).addPathPatterns("/mary/**")    //指定拦截的url地址.excludePathPatterns("/user/**", "/swagger-resources/**", "/v2/**");log.info("addInterceptors :" + patterns.toString());}
​/*** 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。* 配置拦截器后swagger访问会被拦截 按如下配置可保持swagger访问* 需要重新指定静态资源* @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {
//        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
//        super.addResourceHandlers(registry);}
}

登录验证通过后,再次进行接口访问时,header中就要携带token信息进行校验。例:

accessToken:xxxtoken加密信息xxxx

verify()也可以用于任意地方进行token校验

解析token:例

DecodedJWT verify = verifier.verify(token);
String role = verify.getClaim("role").asString();

Java开发中token 的使用相关推荐

  1. java开发中遇到的问题及解决方法(持续更新)

    java开发中遇到的问题及解决方法(持续更新) 参考文章: (1)java开发中遇到的问题及解决方法(持续更新) (2)https://www.cnblogs.com/LiuYanYGZ/p/6112 ...

  2. Java开发中Websocket的技术选型参考

    1. 前言 Websocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 ...

  3. Java开发中文件读取方式总结

    JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径.路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:abc1.txt. 什么是相对路径呢?相对路径就是 ...

  4. Java开发中消息中间件的优势有哪些?

    系统解耦 交互系统之间没有直接的调用关系,只是通过消息传输,故系统侵入性不强,耦合度低. 提高系统响应时间 例如原来的一套逻辑,完成支付可能涉及先修改订单状态.计算会员积分.通知物流配送几个逻辑才能完 ...

  5. Java开发中Netty线程模型原理解析!

    Java开发中Netty线程模型原理解析,Netty是Java领域有名的开源网络库具有高性能和高扩展性的特点,很多流行的框架都是基于它来构建.Netty 线程模型不是一成不变的,取决于用户的启动参数配 ...

  6. Java开发中更多常见的危险信号

    在< Java开发中的常见危险信号>一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似于"代码气味&q ...

  7. Java开发中的常见危险信号

    在开发,阅读,复审和维护成千上万行Java代码的几年中,我已经习惯于看到Java代码中的某些" 危险信号 ",这些信号通常(但可能并非总是)暗示着代码问题. 我不是在谈论总是错误的 ...

  8. JReBel激活码注册申请--方便Java开发中使用Jrebel热部署

    JReBel激活码注册申请--方便Java开发中使用Jrebel热部署 示例: rO0ABXNyAChjb20uemVyb3R1cm5hcm91bmQubGljZW5zaW5nLlVzZXJMaWNl ...

  9. java property xml,Java开发中读取XML与properties配置文件的方法

    相关阅读: 1. XML文件: 什么是XML?XML一般是指可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 2.XML文件的优点: 1)XML文档内容和结构完 ...

最新文章

  1. Python os模块常用命令
  2. 三维重建 3D reconstruction 有哪些实用算法?
  3. C++返回栈上的数组(局部变量)问题探索
  4. ironpython使用dictionary_在C#环境中动态调用IronPython脚本(一)
  5. 全国计算机等级考试题库二级C操作题100套(第88套)
  6. mysql中的lgwr_MySQL Replication和Oracle logical standby的原理对比
  7. C语言文件的随机读写
  8. iOS开发系列--Objective-C之类和对象
  9. linux camera 存储,OpenCV调用摄像头录像并保存下来
  10. 运筹学_大M法_week4
  11. General VDPConfig对讲配置工具
  12. Excel-单纯形法(大M法)求解 直接求解与规划求解功能
  13. 十六进制转float
  14. vss服务器状态失败_VSS常犯错误(转载)
  15. 计算机cpu占用率高,CPU占用率高怎么解决?Win10系统电脑CPU占用率100%的解决方法...
  16. Niubility (分享一) Flink 在快手实时多维分析场景的应用
  17. 数据库设计学习②:数据库设计的步骤
  18. 卡片式轮播图 效果 实现
  19. 刷脸支付人工智能和商业领域进一步融合
  20. 区块链+慈善究竟帮助过谁?

热门文章

  1. linux监控nas日志,NAS存储抓包分析
  2. c#模态对话框从内部退出_C#模态对话框和非模态对话框
  3. CSS 渐变与文本格式化
  4. Build generate signed apk 时忘记打包签名密码怎么办?这里有方法来帮你找回
  5. SQLcolumn ambiguously defined异常
  6. C/C++开发,物联网通信-如何基于TCP/IP简要设计业务应用协议(c++案例)
  7. Emmylua 调用unity api
  8. VS2010中文旗舰版下载 Visual Studio 2010 Ultimate
  9. poi 操作 excel 里面设置的公式不会自动计算 需要双击才会触发
  10. scriptlet相关补充