利用jwt生成token,用于http请求身份验证
前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行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请求身份验证的更多相关文章
- 国服最强JWT生成Token做登录校验讲解,看完保证你学会!
转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...
- 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分
原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...
- Token:服务端身份验证的流行方案【转】
01- 身份认证 服务端提供资源给客户端,但是某些资源是有条件的.所以服务端要能够识别请求者的身份,然后再判断所请求的资源是否可以给请求者. token是一种身份验证的机制,初始时用户提交账号数据给服 ...
- Token:服务端身份验证的流行方案
01- 身份认证 服务端提供资源给客户端,但是某些资源是有条件的.所以服务端要能够识别请求者的身份,然后再判断所请求的资源是否可以给请求者. token是一种身份验证的机制,初始时用户提交账号数据给服 ...
- tp5使用jwt生成token,做api的用户认证
首先 composer 安装 firebase/php-jwt github:https://github.com/firebase/php-jwt composer require firebas ...
- JWT生成token及过期处理方案
业务场景 在前后分离场景下,越来越多的项目使用token作为接口的安全机制,APP端或者WEB端(使用VUE.REACTJS等构建)使用token与后端接口交互,以达到安全的目的.本文结合stacko ...
- JWT生成token
1.JWT简介 JSON Web Token 简称JWT.一个JWT实际上就是一个字符串,它由三部分组成,头部.载荷与签名.JWT生成的token是这样的 2.Json Web Token(JWT)生 ...
- .NET6 JWT(生成Token令牌)
一.Net 6环境下的.net core项目里如何使用JWT. 第一步,在Nuget引入JWT.Microsoft.AspNetCore.Authentication.JwtBearer这两个NuGe ...
- 使用 JWT 生成 Token 代码示例
JSON Web Token,简称 JWT, 是一个开放的标准(RFC 7519),它定义了以一种紧凑的.自包含的 JSON 对象在各方之间安全传输信息的方式.该信息含有数字签名,可以被验证和信任. ...
随机推荐
- TynSerial自定义对象的序列(还原)
TynSerial自定义对象的序列(还原) TynSerial是咏南中间件封装的支持数据二进制序列(还原)的类. 对于ORM来说,序列类必须序列(还原)自定义对象. 1)定义一个自定义对象 type ...
- Get Argument Values From Linq Expression
Get Argument Values From Linq Expression If you even find yourself unpacking an expression in C#, yo ...
- hadoop格式化
1.hadoop启动时,namenode没有启动起来 1.删除 namenode产生的临时文件 tmp 2.删除datanode的数据,否则也不行.(如果datanode有数据,请自己备份) ./bi ...
- Greenwich.SR2版本的Spring Cloud Feign实例
前面我们了解了Spring Cloud Ribbon和Hystrix,在使用上它们基本上会成队出现,那么是不是可以把它们组合起来使用?而且我们发现,在服务消费方a-beautiful-client里通 ...
- ubuntu 17.04 Tomcat安装
安装Tomcat分为两步: JDK和Tomcat 安装jdk 1.在oralce官网下载jdk
- CSS3 @font-face详细用法
@font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体就不用再为只能使用Web安全字体烦恼了!肯定 ...
- iOS-常见问题(错误和警告)
1.storyboard连线问题 产生原因:将与storyboard关联的属性删除了,但是storyboard中还保持之前所关联的属性. 解决:取消关联就没事了. 2.XXXXX ...
- iOS技术面试07:第三方框架
1ios框架分为:cocoa Touch:UIKit.Foundation.附属框架 Media:OpenGL ES.EAGL.Quartz.Core Animation.Core Audio. ...
- Scratch3架构结构说明
Scratch3.0整体项目结构比较庞大,对于不同二次开发开始的时候会出现一头雾水,需要先了解下整体框架,可以按需要在指定的源码下进行修改,大致结构如下: 1. scratch-gui: 是基于Rea ...
- Spring mvc +ajax 发送邮件
1.前端页面--form表单提交,通过发送按钮的id=“send”定位DOM,触发ajax请求 <form class="form-horizontal" id=" ...