JWT 登录实战 – 小松博客

在之前的文章中有写到过用JWT来处理登录的今天来实例代码操作一个,也是我线上正在使用的方式

思路:登录之后生成jwt并写到cookie里,cookie的名字为token,生成的jwt有效期为1小时,每一个判断登录的页面都访问getToken接口,来更新cookie中的token,如果页面停留不操作1小时多,cookie里的token就失效了,需要重新登录。每一个判断登录才能访问的接口,都一个filter来控制,如果token失效那接口返回错误码。

Cookie 工具类,网上找的

  1. import javax.servlet.http.Cookie;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. public class CookieUtils {
  5. public static String getCookie(HttpServletRequest request, String cookieName){
  6. Cookie[] cookies = request.getCookies();
  7. if(cookies != null){
  8. for(Cookie cookie : cookies){
  9. if(cookie.getName().equals(cookieName)){
  10. return cookie.getValue();
  11. }
  12. }
  13. }
  14. return null;
  15. }
  16. public static void writeCookie(HttpServletResponse response, String cookieName,String value){
  17. Cookie cookie = new Cookie(cookieName,value);
  18. cookie.setPath("/");
  19. cookie.setMaxAge(3600);
  20. response.addCookie(cookie);
  21. }
  22. }

用户接口

  1. public class UserController {
  2. // 登录接口
  3. @PostMapping("/login")
  4. public UserVO login(HttpServletResponse response, @Valid @RequestBody UserForm form, BindingResult bindingResult){
  5. // 判断提交过来的参数是否有错误
  6. if (bindingResult.hasErrors()) {
  7. return UserResultUtil.error(UserEnums.Result.PARM_ERROR.getCode(),
  8. bindingResult.getFieldError().getDefaultMessage());
  9. }
  10. //处理登录过程
  11. // 用户名密码验证成功就 生成token,并且直接保存到cookie里
  12. Long ttlMillis = Long.valueOf(1 60 60) * 1000;
  13. JWTTokenDto jwtTokenDto = new JWTTokenDto();
  14. jwtTokenDto.setSecretKey(getJWTSecret);//加密密码
  15. jwtTokenDto.setUserId(userId);
  16. String token = JWTTokenUtil.createJWT(ttlMillis, jwtTokenDto);
  17. //把生成的jwt保存到cookie里,名字为token
  18. CookieUtils.writeCookie(response, "token", token);
  19. // 返回成功
  20. return UserResultUtil.success();
  21. }
  22. // 更新token
  23. @GetMapping("/getToken")
  24. public UserVO getToken(HttpServletRequest request, HttpServletResponse response) {
  25. String token = CookieUtils.getCookie(request, "token");
  26. if (token == null) {
  27. // cookie没有获取到token就直接返回错误
  28. return UserResultUtil.error(UserEnums.Result.TOKEN_ERROR);
  29. }
  30. // 解密token
  31. String userId = JWTTokenUtil.getUserId(token, getJWTSecret);
  32. if (StringUtils.isBlank(userId)) {
  33. //如果解密出来的token是空就直接返回错误
  34. return UserResultUtil.error(UserEnums.Result.TOKEN_ERROR);
  35. }
  36. // 生成新的token
  37. Long ttlMillis = Long.valueOf(1 60 60) * 1000;
  38. JWTTokenDto jwtTokenDto = new JWTTokenDto();
  39. jwtTokenDto.setSecretKey(getJWTSecret);
  40. jwtTokenDto.setUserId(userId);
  41. String newToken = JWTTokenUtil.createJWT(ttlMillis, jwtTokenDto);
  42. // 写到cookie里
  43. CookieUtils.writeCookie(response, "token", newToken);
  44. // 返回成功
  45. return UserResultUtil.success();
  46. }
  47. }

设置过滤器

  1. public class AuthFilter extends OncePerRequestFilter {
  2. @Override
  3. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
  4. // 设置不需要验证token的链接,可以做到配置中心,可以用接口的名字来做区分,比如Auth结尾的都需要验证
  5. String regEx = ".*Auth";
  6. Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
  7. Matcher matcher = pattern.matcher(request.getServletPath());
  8. if (!matcher.matches()) {
  9. chain.doFilter(request, response);
  10. return;
  11. }
  12. // 获取cookie的token
  13. String token = CookieUtils.getCookie(request, "token");
  14. if (token != null) {
  15. String userId = JWTTokenUtil.getEtongUserId(token, JWTSecret);
  16. if (StringUtils.isNotBlank(userId)) {
  17. chain.doFilter(request, response);
  18. return;
  19. }
  20. }
  21. UserResultUtil.renderJson(response, UserResultUtil.error(UserEnums.Result.TOKEN_FAIL));
  22. return;
  23. }
  24. }

最主要的代码已经在上面了,jwt的工具类网上可以找到

我的项目的前端和后端都在一个域名上不需要处理跨域问题,用nginx 做了反向代码

  1. location /api {
  2. proxy_set_header Host $host;
  3. proxy_set_header X-Real-IP $remote_addr;
  4. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  5. proxy_set_header Cookie $http_cookie;
  6. proxy_pass http://api.phpsong.com/;
  7. proxy_cookie_domain api.phpsong.com www.phpsong.com;
  8. proxy_redirect off;
  9. }

上面主要两个配置

  1. proxy_set_header Cookie $http_cookie;
  2. proxy_cookie_domain api.phpsong.com www.phpsong.com;

不然cookie会写不到,主域名上

QQ交流群:136351212(满) 455721967

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
转载保留版权:小松博客» JWT 登录实战
本文链接地址:https://www.phpsong.com/3826.html


Original url: Access
Created at: 2019-04-11 12:05:20
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论