SessionInterceptor.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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") && !requestUrl.contains("/api/v1/ams/dispatch") && !requestUrl.contains("/api/v1/uc/") && !requestUrl.contains("/api/v1/systemfiles/") && !requestUrl.contains("/api/v1/rms/insertPersonnel")
  34. && (request.getAttribute("userId")==null || request.getAttribute("userName")==null)){
  35. //无权访问
  36. response.setCharacterEncoding("UTF-8");
  37. response.setContentType("application/json; charset=utf-8");
  38. RESTfulResult result =new RESTfulResult("500", "无权访问111", "无权访问");
  39. response.getWriter().write(JSONObject.toJSONString(result));
  40. return false;
  41. }
  42. //获取方法中的注解,看是否有该注解
  43. RequestLimit requestLimit = hm.getMethodAnnotation(RequestLimit.class);
  44. if(requestLimit != null){
  45. try{
  46. String userId = "" + request.getAttribute("userId");
  47. String userName = "" + request.getAttribute("userName");
  48. int seconds = requestLimit.seconds();
  49. int maxCount = requestLimit.maxCount();
  50. String methodName = hm.getMethod().getName();
  51. //获取请求体
  52. BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8"));
  53. StringBuilder strBuilder = new StringBuilder();
  54. String inputStr;
  55. while ((inputStr = streamReader.readLine()) != null) {
  56. strBuilder.append(inputStr);
  57. }
  58. Integer count = redisUtil.get(methodName+userId);
  59. if(count ==null || count < maxCount){
  60. //未超出,+1
  61. count = (count == null ? 0 : count+1);
  62. redisUtil.put( methodName+userId, count);
  63. }else{
  64. //超出访问次数
  65. log.info("访问"+methodName+"方法过快,用户 ===> " + userId + " 且在 " + seconds + " 秒内超过最大限制 ===> " + maxCount + " 次数达到 ====> " + count);
  66. response.setCharacterEncoding("UTF-8");
  67. response.setContentType("application/json; charset=utf-8");
  68. RESTfulResult result =new RESTfulResult("500", "访问过快,请稍后再试", "访问过快,请稍后再试");
  69. response.getWriter().write(JSONObject.toJSONString(result));
  70. return false;
  71. }
  72. }catch (Exception e){
  73. e.printStackTrace();
  74. }
  75. }
  76. return super.preHandle(request, response, handler);
  77. }
  78. }