使用过滤器
    过滤器要起作用,必须在主启动程序上加上@ServletComponentScan注解

    1. @ServletComponentScan //扫描WebFilter的注解
    1. package com.tj.reggie.filter;
    2. import com.alibaba.fastjson.JSON;
    3. import com.tj.reggie.controller.utils.R;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.springframework.util.AntPathMatcher;
    6. import javax.servlet.*;
    7. import javax.servlet.annotation.WebFilter;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import java.io.IOException;
    11. /**
    12. * 检查用户是否已经完成登录
    13. * "/*"是拦截所有访问
    14. */
    15. @WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
    16. @Slf4j
    17. public class LoginCheckFilter implements Filter {
    18. //路径匹配器,支持通配符
    19. public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
    20. @Override
    21. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    22. HttpServletRequest request = (HttpServletRequest) servletRequest; //转成http请求
    23. HttpServletResponse response = (HttpServletResponse) servletResponse; //转成http响应
    24. //1.获取本次请求的URI
    25. String requestURI = request.getRequestURI();
    26. log.info("拦截到请求:{}", requestURI);
    27. //2.定义不需要处理的请求路径
    28. String[] uris = new String[]{
    29. "/users/login",
    30. "/users/logout",
    31. "/login.html",
    32. "/logout.html",
    33. "/img/**"
    34. };
    35. //3.判断本次请求是否需要处理
    36. boolean check = check(uris, requestURI);
    37. if (check) {
    38. //不需要处理的情况
    39. filterChain.doFilter(request, response);
    40. log.info("本次请求不需要处理:{}", requestURI);
    41. return;
    42. }
    43. //4.判断登录状态,如果已登录,则直接放行
    44. if (request.getSession().getAttribute("users") != null) {
    45. filterChain.doFilter(request, response);
    46. log.info("已经登录,用户id为:{}", request.getSession().getAttribute(("users")));
    47. return;
    48. }
    49. //5.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
    50. response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
    51. log.info("未登录,返回响应数据:{}", requestURI);
    52. return;
    53. }
    54. /**
    55. * 路径匹配,检查本次请求是否需要放行
    56. *
    57. * @param uris
    58. * @param requestURI
    59. * @return
    60. */
    61. public boolean check(String[] uris, String requestURI) {
    62. for (String uri : uris) {
    63. boolean match = PATH_MATCHER.match(uri, requestURI);
    64. if (match) return true;
    65. }
    66. return false;
    67. }
    68. }