SessionFilter.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package com.zkh360.api.user.filter;
  2. import com.zkh360.core.util.redis.RedisService;
  3. import org.apache.commons.lang3.StringUtils;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import javax.servlet.*;
  6. import javax.servlet.annotation.WebFilter;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10. import java.io.IOException;
  11. @WebFilter(filterName = "SessionFilter",urlPatterns = {"/*"})
  12. public class SessionFilter implements Filter {
  13. @Autowired
  14. private RedisService redisService;
  15. //标示符:表示当前用户未登录(可根据自己项目需要改为json样式)
  16. String LOGIN_EXPIRED = "{\"stateCode\":\"1002\",\"message\":\"用户信息失效\"}";
  17. //必须要登陆后才可以访问的接口
  18. String[] includeUrls = new String[]{
  19. "/h5/shoppingCart",
  20. "/h5/order",
  21. "/h5/shoppingCart/add",
  22. "/h5/shoppingCart/delete",
  23. "/h5/shoppingCart/update",
  24. "/h5/shoppingCart/inquiry",
  25. "/h5/inquiry",
  26. "h5/list",
  27. "/h5/invoice",
  28. "/h5/ReceiveAddress",
  29. "/h5/logistics",
  30. "/h5/password/update",
  31. "/h5/userinfo",
  32. "token"
  33. };
  34. @Override
  35. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  36. HttpServletRequest request = (HttpServletRequest) servletRequest;
  37. HttpServletResponse response = (HttpServletResponse) servletResponse;
  38. HttpSession session = request.getSession(false);
  39. ServletContext servletContext = request.getServletContext();
  40. //获取请求的token
  41. String requestAuthorization = request.getHeader("Authorization");
  42. String method = request.getMethod();
  43. String uri = request.getRequestURI();
  44. if(isNeedAuthorization(uri) && !"options".equalsIgnoreCase(request.getMethod())){
  45. if(StringUtils.isBlank(requestAuthorization)){
  46. // Authorization不存在,返回登陆过期
  47. setResponseParam(response);
  48. return;
  49. }
  50. }
  51. if(StringUtils.isBlank(requestAuthorization)){
  52. // 未登录过 发票ID为null
  53. filterChain.doFilter(servletRequest, servletResponse);
  54. return;
  55. }
  56. //获取与token绑定的invoiceId
  57. if (!redisService.exists(requestAuthorization)){
  58. // Authorization不存在,返回登陆过期
  59. setResponseParam(response);
  60. return;
  61. }
  62. String invoiceIdValue = redisService.get(requestAuthorization).toString();
  63. //验证invoceId是否可用
  64. if(StringUtils.isNotBlank(invoiceIdValue)){
  65. // 已登陆 给发票ID赋值
  66. servletContext.setAttribute(requestAuthorization,invoiceIdValue);
  67. filterChain.doFilter(servletRequest, servletResponse);
  68. return;
  69. }else{
  70. // 登陆过期,重新登陆
  71. setResponseParam(response);
  72. return;
  73. }
  74. }
  75. private void setResponseParam(HttpServletResponse response)throws IOException{
  76. response.setCharacterEncoding("UTF-8");
  77. response.setContentType("application/json");
  78. response.setHeader("Access-Control-Allow-Origin","*");
  79. response.getWriter().write(this.LOGIN_EXPIRED);
  80. }
  81. /**
  82. * @Description: 是否必须要登陆
  83. * @param uri
  84. */
  85. public boolean isNeedAuthorization(String uri) {
  86. for (String includeUrl : includeUrls) {
  87. if(uri.contains(includeUrl)) {
  88. return true;
  89. }
  90. }
  91. return false;
  92. }
  93. @Override
  94. public void init(FilterConfig filterConfig) throws ServletException {
  95. }
  96. @Override
  97. public void destroy() {
  98. }
  99. }