JSON Web标记简称JWT,是用于对应用程序上的用户进行身份验证的标记,也就是说,使用JWT的应用程序不再需要保存有关其用户的饼干或其他会话数据。此特性便于可伸缩性,同时保证应用程序的安全。
在身份验证过程中,当用户使用其凭据成功登录时,将返回JSON Web标记,并且必须在本地保存(通常在本地存储中)。每当用户要访问受保护的路由或资源(端点)时,用户代理(用户代理)必须连同请求一起发送JWT,通常在授权标头中使用无记名模式。后端服务器接收到带有JWT的请求时,首先要做的是验证牌。
JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C
由JWT头部信息头加密得到
B由JWT用到的身份验证信息json数据加密得到
C由A和B加密得到,是校验部分
可以放到HTTP请求的请求头中,通常是授权字段。
jwt流程图中将
加入Maven jwt依赖
& lt; dependency> & lt; groupId> io.jsonwebtoken & lt; artifactId> jjwt & lt; version> 0.9.1 & lt;/dependency>
在application.proterties中加入配置
#加密严 jwt.secret=A0B1C2D3E4F5G6H7I8J9KALBMCNDOEPFQ0R1S2T3U4V5W6X7Y8Z9 # tocken过期时间,单位秒 jwt.expire=300 #需要认证的url,多个url使用英文逗号,分割 jwt.authorised-urls=/api/fis/复述,/* * >之前JwtHelper工具类
进口java.text.SimpleDateFormat; 进口java.util.Calendar; 进口java.util.Date; 进口java.util.Map; 进口javax.servlet.http.HttpServletRequest; 进口com.alibaba.fastjson.JSONObject; 进口io.jsonwebtoken.Jwts; 进口io.jsonwebtoken.SignatureAlgorithm; 公开课JwtHelper { 私人长EXPIRATION_TIME; 私人秘密字符串; 私人最终字符串TOKEN_PREFIX=俺制比恕? 私人最终字符串HEADER_STRING=笆谌ā? 公共JwtHelper(字符串秘密,长到期){ 这一点。EXPIRATION_TIME=到期; 这一点。秘密=秘密; System.out.println(“正在初始化Jwthelper,到期=" +到期); } 公共JSONObject generateToken (Map<字符串,Object>索赔){ 日历c=Calendar.getInstance (); c。凝固时间(新日期()); c.add(日历。第二,EXPIRATION_TIME.intValue ()); d=c.getTime日期(); 字符串jwt=Jwts.builder () .setClaims(索赔) .setExpiration (d) .signWith (SignatureAlgorithm。HS512秘密) .compact (); JSONObject json=new JSONObject (); json。put(“令牌”,TOKEN_PREFIX + " " + jwt); json。把(“令牌类型”,TOKEN_PREFIX); json。(“expire-time”,新的SimpleDateFormat (yyyy-MM-dd HH: ss: mm) .format (d)); 返回json; } 公共Map<字符串,Object>validateTokenAndGetClaims (HttpServletRequest请求){ 字符串标记=request.getHeader (HEADER_STRING); system . out。println(“令牌:“+令牌); 如果令牌==null) { 返回null; } Object> Map<字符串;身体=Jwts.parser () .setSigningKey(秘密) .parseClaimsJws(令牌。替换(TOKEN_PREFIX”、“)) .getBody (); 恢复身体; } }JWT过滤器JwtFilter
进口java.io.IOException; 进口java.util.Arrays; 进口并不知道; 进口javax.servlet.Filter; 进口javax.servlet.FilterChain; 进口javax.servlet.FilterConfig; 进口javax.servlet.ServletException; 与javax . servlet . servletrequest进口; 进口javax.servlet.ServletResponse; 进口javax.servlet.http.HttpServletRequest; 进口javax.servlet.http.HttpServletResponse; 进口org.springframework.http.HttpStatus; 进口org.springframework.util.AntPathMatcher;/* * * JWT过滤器 * * @author李庆海 * */公共类JwtFilter实现滤波器{ 私人JwtHelper JwtHelper; 私人Listurl=零; 私有静态最终org.springframework.util。PathMatcher PathMatcher=new AntPathMatcher (); 公共JwtFilter (JwtHelper JwtHelper, String [] authorisedUrls) { 这一点。jwtHelper=jwtHelper; url=arrays . aslist (authorisedUrls); } @Override FilterConfig FilterConfig公共空init()抛出ServletException {//SpringBeanAutowiringSupport。processInjectionBasedOnServletContext(这,filterConfig.getServletContext ()); } @Override 公共空间的doFilter (ServletRequest请求,ServletResponse响应FilterChain链)抛出IOException, ServletException { HttpServletRequest httpRequest=(HttpServletRequest)请求; HttpServletResponse httpResponse=(HttpServletResponse)反应; httpResponse.setCharacterEncoding (“utf - 8”); application/json httpResponse.setContentType (“;charset=utf - 8”); httpResponse。setHeader (“Access-Control-Allow-Origin”、“*”); 如果(“选项”.equals (httpRequest.getMethod ())) { httpResponse.setStatus (HttpStatus.NO_CONTENT.value ());//HttpStatus。SC_NO_CONTENT=204 httpResponse。setHeader(“Access-Control-Allow-Credentials”,“真正的”); httpResponse。setHeader (“Access-Control-Allow-Headers”、“内容类型、x-requested-with牌”); httpResponse。setHeader (“Access-Control-Allow-Methods”、“选项,GET、POST、删除”); } 字符串spath=httpRequest.getServletPath (); 尝试{//验证受保护的接口 (字符串url: url) { 如果(pathMatcher。匹配(url, spath)) { 令牌对象=jwtHelper.validateTokenAndGetClaims (httpRequest); 如果(令牌!=null) { 链。doFilter(请求、响应); 返回; 其他}{ httpResponse.sendError (HttpServletResponse。SC_UNAUTHORIZED”,未授权或者授权已经过期”); 返回; } 其他}{ 链。doFilter(请求、响应); 返回; } } }捕捉(异常e) { e.printStackTrace (); } 链。doFilter(请求、响应); 返回; } @Override 公共空间摧毁(){ } } 在SpringBoot中使用JWT的实现方法