PageRenderTime 133ms CodeModel.GetById 33ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/penuel/mythopoet/interceptors/LoginRequiredInterceptor.java

https://gitlab.com/tycoon/mythopoet
Java | 117 lines | 89 code | 18 blank | 10 comment | 22 complexity | 64f34ed82da3bea6c7f97111318c58a9 MD5 | raw file
  1. package com.penuel.mythopoet.interceptors;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.penuel.mythopoet.annotation.LoginRequired;
  4. import com.penuel.mythopoet.annotation.ResponseResult;
  5. import com.penuel.mythopoet.constants.PoetConstants;
  6. import com.penuel.mythopoet.model.AccessToken;
  7. import com.penuel.mythopoet.service.AccessTokenService;
  8. import com.penuel.mythopoet.utils.RequestUtil;
  9. import com.penuel.mythopoet.utils.ResponseUtil;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.apache.commons.lang3.math.NumberUtils;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.web.bind.annotation.RequestParam;
  16. import org.springframework.web.method.HandlerMethod;
  17. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  18. import javax.servlet.http.HttpServletRequest;
  19. import javax.servlet.http.HttpServletResponse;
  20. import java.io.PrintWriter;
  21. /**
  22. * LoginRequiredInterceptor Created with mythopoet.
  23. * User: penuel (penuel.leo@gmail.com)
  24. * Date: 15/5/3 下午2:40
  25. * Desc: 登陆拦截器
  26. */
  27. public class LoginRequiredInterceptor extends HandlerInterceptorAdapter {
  28. private static final Logger LOGGER = LoggerFactory.getLogger(LoginRequiredInterceptor.class);
  29. @Autowired
  30. private AccessTokenService accessTokenService;
  31. @Override
  32. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  33. try {
  34. LoginRequired loginRequired = priorityTokenValid(handler);
  35. if ( null != loginRequired ) {
  36. String token = getValueFromTokenOrRequest(PoetConstants.COOKIE_TOKEN, request);
  37. String userId = getValueFromTokenOrRequest(PoetConstants.COOKIE_USER_ID, request);
  38. //验证token 和 acctId的合法性 即账号和总店
  39. boolean isLogin = isLegalUser(userId, token);
  40. if ( !isLogin ) {
  41. RequestUtil.clearCookie(request, response);
  42. if ( ResponseResult.JSON == loginRequired.result() ) {
  43. response.setCharacterEncoding("UTF-8");
  44. response.setContentType("application/json");
  45. PrintWriter printWriter = response.getWriter();
  46. JSONObject jo = ResponseUtil.resultJSON(101, "用户不合法或已失效,请重新登陆", null);
  47. printWriter.write(jo.toJSONString());
  48. printWriter.flush();
  49. } else {
  50. String uri = request.getRequestURI();
  51. if(uri.equals("")){
  52. response.sendRedirect("/user/login");
  53. }else{
  54. response.sendRedirect("/user/login?redirect="+uri);
  55. }
  56. }
  57. return false;
  58. }
  59. // response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  60. // response.setHeader("Pragma", "no-cache");
  61. // response.setHeader("Expires", "0");
  62. }
  63. } catch ( Exception e ) {
  64. LOGGER.error("LoginRequiredInterceptor.preHandle error:", e);
  65. }
  66. return true;
  67. }
  68. private boolean isLegalUser(String cookieUserId, String cookieAccessToken) {
  69. if ( cookieUserId == null || NumberUtils.toLong(cookieUserId) < 1 ) {
  70. return false;
  71. }
  72. AccessToken accessToken = accessTokenService.getByUserId(NumberUtils.toLong(cookieUserId));
  73. if ( accessToken == null || !accessToken.getToken().equals(cookieAccessToken) ) {
  74. return false;
  75. }
  76. return true;
  77. }
  78. private LoginRequired priorityTokenValid(Object handler) {
  79. LoginRequired loginRequired = null;
  80. if ( null != handler && handler instanceof HandlerMethod ) {
  81. HandlerMethod method = (HandlerMethod) handler;
  82. LoginRequired methodAnnotion = method.getMethod().getAnnotation(LoginRequired.class);
  83. LoginRequired clazzAnnotion = method.getMethod().getDeclaringClass().getAnnotation(LoginRequired.class);
  84. if ( null != methodAnnotion ) {
  85. loginRequired = methodAnnotion;
  86. } else if ( null != clazzAnnotion ) {
  87. loginRequired = clazzAnnotion;
  88. }
  89. }
  90. return loginRequired;
  91. }
  92. private String getValueFromTokenOrRequest(String key, HttpServletRequest request) {
  93. String value = RequestUtil.getCookieValue(request, key);
  94. if ( StringUtils.isBlank(value) ) {
  95. value = request.getParameter(key);
  96. }
  97. return value;
  98. }
  99. }