当前位置:   article > 正文

SpringMVC使用JWT简单验证_springmvc jwt

springmvc jwt

 JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库。

 

首先看下JWT的流程图:

身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录(SSO)中比较广泛的使用了该技术。 信息交换在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。

SpringMVC中使用的步骤:

1.创建JWT工具类

  1. public class jwtUtil {
  2. private static Logger logger = LoggerFactory.getLogger(jwtUtil.class);
  3. private static final String SECRET = "你的秘钥";
  4. private static final long EXPIRATION_TIME = 1 * 24 * 60 * 60 * 1000; //有效期
  5. /**
  6. * HS256加密
  7. * @return
  8. * @throws Exception
  9. */
  10. public static String createTokenHS256(String subject) throws Exception{
  11. String token="";
  12. try {
  13. long nowMillis = System.currentTimeMillis();
  14. long expMillis = nowMillis + EXPIRATION_TIME;
  15. Date exp = new Date(expMillis);
  16. Algorithm algorithm = Algorithm.HMAC256(SECRET);
  17. token = JWT.create()
  18. .withSubject(subject)
  19. .withIssuer("demo")
  20. .withExpiresAt(exp)
  21. .sign(algorithm);
  22. } catch (JWTCreationException exception){
  23. logger.error("HS256加密异常",exception.getMessage());
  24. }
  25. return token;
  26. }
  27. /**
  28. * HS256解密
  29. * @param token
  30. * @throws Exception
  31. */
  32. public static String verifyTokenHS256(String token) throws Exception{
  33. String subject="";
  34. try {
  35. Algorithm algorithm = Algorithm.HMAC256(SECRET);
  36. JWTVerifier verifier = JWT.require(algorithm)
  37. .withIssuer("demo")
  38. .build();
  39. subject = verifier.verify(token).getSubject();
  40. } catch (JWTVerificationException exception){
  41. logger.error("HS256解密异常",exception.getMessage());
  42. }
  43. return subject;
  44. }
  45. }

2.创建拦截器

  1. public class TokenInterceptor implements HandlerInterceptor {
  2. /**
  3. * 拦截每个请求
  4. */
  5. @Override
  6. public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {
  7. response.setCharacterEncoding("utf-8");
  8. String token = request.getParameter("token");
  9. String userId= request.getParameter("userId");
  10. //token存在
  11. if(null != token) {
  12. String subject=jwtUtil.verifyTokenHS256(token);
  13. if(!StringUtils.isEmpty(subject) && !StringUtils.isEmpty(userId)){
  14. if(userId.equals(subject)) {
  15. return true;
  16. }
  17. else{
  18. responseMessage(response, response.getWriter(), "请求未通过");
  19. return false;
  20. }
  21. }
  22. else{
  23. responseMessage(response, response.getWriter(), "请求未通过");
  24. return false;
  25. }
  26. }
  27. else{
  28. responseMessage(response, response.getWriter(), "请求未通过");
  29. return false;
  30. }
  31. }
  32. /**
  33. * 请求不通过,返回错误信息给客户端
  34. * @param response
  35. * @param out
  36. * @param responseData
  37. */
  38. private void responseMessage(HttpServletResponse response, PrintWriter out, String responseMsg) {
  39. response.setContentType("application/json; charset=utf-8");
  40. out.print(responseMsg);
  41. out.flush();
  42. out.close();
  43. }
  44. }

3.在springmvc-servlet.xml中配置拦截器

  1. <mvc:interceptors>
  2. <mvc:interceptor>
  3. <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
  4. <mvc:mapping path="/**" />
  5. <mvc:exclude-mapping path="/user/register" />
  6. <mvc:exclude-mapping path="/user/login" />
  7. <bean class="com.demo.interceptor.TokenInterceptor"></bean>
  8. </mvc:interceptor>
  9. </mvc:interceptors>

4.登录时调用jwtUtil生成token,并封装进用户对象返回前端,前端调用后台接口带上userId和token即可。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/182342
推荐阅读
相关标签
  

闽ICP备14008679号