前言
最近開發小程序後端是需要對接口進行安全性防護,第一步就是考慮使用token。jwt很好的規範了服務端token校驗規則。如果對jwt不瞭解,請看:https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
下面是我做的小程序springboot集成jwt的案例,只做了簡單操作。
1.導入依賴
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2.編寫jwt工具類(解析、生成jwt)
@Slf4j
public class JwtUtil {
public static long ttl = 1 * 12 * 3600 * 1000;//一天
/**
* 生成token
*/
public static String generateToken(String subject) {
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
JwtBuilder jwt = Jwts.builder()
.setSubject(subject) //主題
.setIssuedAt(now) //簽發時間
.signWith(SignatureAlgorithm.HS256, WxStaticData.jwtSecret);
if (ttl > 0) {
//設置過期時間
jwt.setExpiration(new Date(nowMillis + ttl));
}
return jwt.compact();
}
/**
* 解析token
*/
public static ResponseEntity parseToken(String token) {
//ResponseEntity 是我自己定義的返回類
ResponseEntity res = null;
Claims claims = null;
try {
claims = Jwts.parser()
.setSigningKey(WxStaticData.jwtSecret)
.parseClaimsJws(token)
.getBody();
} catch (ExpiredJwtException e) {
res = new ResponseEntity(300, "token過期");
log.debug("token過期");
return res;
} catch (JwtException e) {
res = new ResponseEntity(301, "token解析失敗");
log.debug("token解析失敗");
return res;
}
res = new ResponseEntity(200, "token校驗成功", claims);
return res;
}
}
3. 編寫攔截器對部分請求進行攔截校驗token
public class JwtHandlerInterceptor implements HandlerInterceptor {
/**
* 在請求處理之前進行調用(Controller方法調用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getParameter("token");
ResponseEntity res = JwtUtil.parseToken(token);
//如果校驗成功返回true
if(res.getCode()==200) return true;
else {
//校驗失敗,返回錯誤信息
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.println(JSON.toJSONString(res));
return false;
}
}
}
4.添加攔截器到springboot
@Configuration
public class MyWebConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JwtHandlerInterceptor())
.addPathPatterns("/**")
//排除不需要token校驗的接口
.excludePathPatterns("/login","/register");
}
}
總結
其實裏面可以做更復雜的邏輯,比如說再加上spring security進行身份權限處理 。我這邊只做了簡單操作,如果有感興趣的大佬可以私聊我相互討論。