SessionInterceptor.java 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package com.steerinfo.dil.config;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.steerinfo.dil.annotaion.LogAround;
  4. import com.steerinfo.dil.annotaion.RequestLimit;
  5. import com.steerinfo.framework.controller.RESTfulResult;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.stereotype.Component;
  8. import org.springframework.web.method.HandlerMethod;
  9. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  10. import springfox.documentation.spring.web.json.Json;
  11. import javax.servlet.ReadListener;
  12. import javax.servlet.ServletInputStream;
  13. import javax.servlet.http.Cookie;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletRequestWrapper;
  16. import javax.servlet.http.HttpServletResponse;
  17. import java.io.*;
  18. import java.util.Arrays;
  19. import java.util.HashMap;
  20. import java.util.Map;
  21. /**
  22. * Web拦截器,拦截请求并校验
  23. */
  24. @Slf4j
  25. @Component
  26. public class SessionInterceptor extends HandlerInterceptorAdapter {
  27. //暂时使用Map当做Redis缓存
  28. private static Map<String,Integer> redisUtil = new HashMap<>();
  29. @Override
  30. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  31. HandlerMethod hm = (HandlerMethod) handler;
  32. String requestUrl = "" + request.getRequestURL();
  33. if(!requestUrl.contains("/api/v1/bp/bpLogin") && (request.getAttribute("userId")==null || request.getAttribute("userName")==null)){
  34. //无权访问
  35. response.setCharacterEncoding("UTF-8");
  36. response.setContentType("application/json; charset=utf-8");
  37. RESTfulResult result =new RESTfulResult("500", "无权访问111", "无权访问");
  38. response.getWriter().write(JSONObject.toJSONString(result));
  39. return false;
  40. }
  41. //获取方法中的注解,看是否有该注解
  42. RequestLimit requestLimit = hm.getMethodAnnotation(RequestLimit.class);
  43. if(requestLimit != null){
  44. try{
  45. String userId = "" + request.getAttribute("userId");
  46. String userName = "" + request.getAttribute("userName");
  47. int seconds = requestLimit.seconds();
  48. int maxCount = requestLimit.maxCount();
  49. String methodName = hm.getMethod().getName();
  50. //获取请求体
  51. BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8"));
  52. StringBuilder strBuilder = new StringBuilder();
  53. String inputStr;
  54. while ((inputStr = streamReader.readLine()) != null) {
  55. strBuilder.append(inputStr);
  56. }
  57. Integer count = redisUtil.get(methodName+userId);
  58. if(count ==null || count < maxCount){
  59. //未超出,+1
  60. count = (count == null ? 0 : count+1);
  61. redisUtil.put( methodName+userId, count);
  62. }else{
  63. //超出访问次数
  64. log.info("访问"+methodName+"方法过快,用户 ===> " + userId + " 且在 " + seconds + " 秒内超过最大限制 ===> " + maxCount + " 次数达到 ====> " + count);
  65. response.setCharacterEncoding("UTF-8");
  66. response.setContentType("application/json; charset=utf-8");
  67. RESTfulResult result =new RESTfulResult("500", "访问过快,请稍后再试", "访问过快,请稍后再试");
  68. response.getWriter().write(JSONObject.toJSONString(result));
  69. return false;
  70. }
  71. }catch (Exception e){
  72. e.printStackTrace();
  73. }
  74. }
  75. return super.preHandle(request, response, handler);
  76. }
  77. }