FormTokenAspect.java 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package com.sooka.common.aop;
  2. import com.sooka.common.exception.SystemException;
  3. import com.sooka.common.utils.StrUtil;
  4. import org.aspectj.lang.ProceedingJoinPoint;
  5. import org.aspectj.lang.annotation.Around;
  6. import org.aspectj.lang.annotation.Aspect;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.web.context.request.RequestContextHolder;
  11. import org.springframework.web.context.request.ServletRequestAttributes;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import javax.servlet.http.HttpSession;
  15. @Aspect
  16. @Component
  17. public class FormTokenAspect {
  18. private static final String PARAM_TOKEN = "token";
  19. private static final String PARAM_TOKEN_FLAG = "TokenFlag_";
  20. private static final Logger log = LoggerFactory.getLogger(FormTokenAspect.class);
  21. @Around("@annotation(com.sooka.common.annotation.FormToken)")
  22. public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
  23. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  24. HttpServletRequest request = attributes.getRequest();
  25. HttpServletResponse response = attributes.getResponse();
  26. String className = joinPoint.getTarget().getClass().getName();
  27. HttpSession session = request.getSession();
  28. if ("GET".equalsIgnoreCase(request.getMethod())) {
  29. log.info("生成token");
  30. /* GET 生成 token */
  31. return this.generate(joinPoint, request, session, PARAM_TOKEN_FLAG + className);
  32. } else {
  33. log.info("验证token");
  34. /* POST 验证 token */
  35. return this.validation(joinPoint, request,response, session, PARAM_TOKEN_FLAG + className);
  36. }
  37. }
  38. public Object generate(ProceedingJoinPoint joinPoint, HttpServletRequest request, HttpSession session,
  39. String tokenFlag) throws Throwable {
  40. String uuid = StrUtil.getUUID().toString();
  41. String tokenInput = "<input id=\"token\" type=\"hidden\" name=\""+PARAM_TOKEN+"\" value=\"" + uuid + "\">";
  42. session.setAttribute(tokenFlag, uuid);
  43. request.setAttribute(PARAM_TOKEN, tokenInput);
  44. return joinPoint.proceed();
  45. }
  46. public Object validation(ProceedingJoinPoint joinPoint, HttpServletRequest request,HttpServletResponse response, HttpSession session,
  47. String tokenFlag) throws Throwable {
  48. Object sessionFlag = session.getAttribute(tokenFlag);
  49. Object requestFlag = request.getParameter(PARAM_TOKEN);
  50. if (requestFlag!=null&&sessionFlag != null && sessionFlag.equals(requestFlag)) {
  51. session.removeAttribute(tokenFlag);
  52. }else {
  53. throw new SystemException("不能重复提交表单!");
  54. }
  55. return joinPoint.proceed();
  56. }
  57. }