JWT2是什么?spring jwt token
00-1010 1.JWT2是什么?JWT生成令牌2.1添加依赖项2.2生成令牌2.3使用拦截器解析令牌。
00-1010JWT官方定义为:JSON Web Token (JWT)是一种开放标准(RFC 7519),用于在各方之间以JSON对象的形式安全传输信息。该信息可以被验证和信任,因为它是数字签名的。Jwt可以用一个秘密(使用HMAC算法)或RSA或ECDSA的公钥/私钥对进行签名。
其实本质上就是一个签名,用来验证用户是否可以请求受限资源(比如向商城的服务器请求个人中心页面信息和购物车页面信息)。
比如你家楼下有个自助餐厅,自助餐厅前面有个收银台。中午你觉得饿了,去食堂吃饭,到收银台交钱。收银台给你一张付款证明,上面写着你付款的时间和金额。现在,你可以拿着这个证书去餐馆吃饭了。吃饭的时候只需要给这个证明,因为他认证了你的信息。店员知道你付过钱,不会让你再付了。同时防止你不付款。
在这个例子中,如果我们把场景换成一个网上商城(前后端分开),收银台就会登录。登录后,服务器会给你一个你已经登录的证书。此证书包含生成时间、您的信息等。这时,如果你想访问购物车,就拿着这个证书发送到服务器。服务器将验证证书,并在验证后返回您想要的数据。
还有一种情况是,如果你不登录,想直接访问购物车的数据,服务器会发现你没有令牌(或者你伪造了令牌,服务器验证不通过或者令牌过期),就会让你重新登录,从而实现阻止访问受限资源的功能。
目录
1.什么是JWT
依赖关系groupId com . auth 0/groupId artifactId Java-jwt/artifactId版本3 . 10 . 3/version/dependency依赖关系groupIdio.jsonwebtoken/groupId artifactId jjwt/artifactId版本0.9.1/version/dependency
00-1010这种情况是在登录的控制器中,正确输入用户的账号密码,生成令牌,其中最重要的是令牌的密码,验证令牌时需要用到。
JwtBuilder builder=jwts . builder();token=builder . set subject( username )。setissuedat(new date())//设置令牌生成时间。setId(u . get userid() )//Set tokenid . Set expiration(new date(system。current time millis()24 * 60 * 60 * 1000))//设置到期时间,现在设置一天。sign with(signaturealgorithm . hs 256, 123456 )//设置令牌密码,需要使用。压缩以解析令牌。当这个令牌生成后,它将被返回到前端,当前端收到它时,它将被存储在cookie中。这里提供了一个设置cookies的工具代码,每次前端发送请求都可以直接使用请求头中的token。
var运算符==;//取出cookie函数get cookie value(key str){ var value=null;var s=window . document . cookie;var arr=s . split(;);for(var I=0;iarr .长度;I){ var str=arr[I];var k=str . split(operator)[0];var v=str.split(运算符)[1];if(k==keyStr){ value=v;打破;} }返回值;}//设置cookie函数setcookie value (key,value) {document.coo
kie = key+operator+value;}
2.3 使用拦截器解析token
配置拦截器
其中ResultVO和ResStatus为封装的返回对象,代码如下:
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class ResultVO { @ApiModelProperty("响应状态码") private Integer code; @ApiModelProperty("响应信息") private String msg; @ApiModelProperty("响应数据") private Object Data;}
public class ResStatus { public static Integer OK = 10000; public static Integer NO = 10001; public static Integer PASS = 20002;}
@Componentpublic class CheckTokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //因为是在请求头中发送token,所以第一次请求的方法为"OPTIONS",具体可以看TCP/IP协议 String method = request.getMethod(); if("OPTIONS".equalsIgnoreCase(method)){ return true; } String token = request.getHeader("token"); System.out.println("token:"+token); if(token == null){ ResultVO resultVO = new ResultVO(ResStatus.NO,"请先登录",null); doResponse(response,resultVO); }else{ try{ //在jwt中,只要token不合法或者验证不通过就会抛出异常 JwtParser parser = Jwts.parser(); parser.setSigningKey("123456"); Jws<Claims> claimsJws = parser.parseClaimsJws(token); return true; }catch (ExpiredJwtException e1) { ResultVO resultVO = new ResultVO(ResStatus.PASS, "登录过期,请重新登录", null); doResponse(response,resultVO); }catch (UnsupportedJwtException e2){ ResultVO resultVO = new ResultVO(ResStatus.NO, "Token不合法,已记录恶意IP", null); doResponse(response,resultVO); }catch (Exception e3){ ResultVO resultVO = new ResultVO(ResStatus.NO, "请先登录", null); doResponse(response,resultVO); } } return false; } @SneakyThrows private void doResponse(HttpServletResponse response, ResultVO resultVO) { response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); String s = new ObjectMapper().writeValueAsString(resultVO); out.print(s); out.flush(); out.close(); }}
设置拦截器拦截的内容
拦截了shopcart的请求,排除了user开头的请求,因为user开头请求负责登录和注册不应被拦截
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.annotation.Resource;@Configurationpublic class InterceptorConfig implements WebMvcConfigurer { @Resource private CheckTokenInterceptor checkTokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(checkTokenInterceptor) .addPathPatterns("/shopcart/**") .excludePathPatterns("/user/**"); }}
到此这篇关于SpringBoot-JWT生成Token和拦截器的使用(访问受限资源)的文章就介绍到这了,更多相关SpringBoot-JWT生成Token和拦截器内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。