如何实现用户未登录不可访问系统

        在开发web系统时,如果用户不登录,发现用户也可以直接正常访问系统,这种设计本身并不合理,那么我们希望看到的效果是,只有用户登录成功之后才可以正常访问系统,如果没有登录则拒绝访问。那么我们可以使用过滤器或者拦截器进行实现,当前使用的方式是在spring boot框架中使用过滤器实现。

  1. 首先在SpringBoot启动类上加上注解@ServletComponentScan
    1. 如何实现用户未登录不可访问系统_第1张图片
  2. 创建自定义的过滤器LoginFilter,其中需要给登录接口放行。因为登录的用户信息存在session中,所以可以根据session的信息进行判断用户是否已经登录过系统
    1. package com.app.studypro.filter;
      
      import com.alibaba.fastjson.JSON;
      import com.app.studypro.common.ResultBean;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.util.AntPathMatcher;
      
      import javax.servlet.*;
      import javax.servlet.annotation.WebFilter;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * 检查用户是否已经完成登录
       *
       * @author Administrator
       */
      @WebFilter(filterName = "loginFilter", urlPatterns = "/*")
      @Slf4j
      public class LoginFilter implements Filter {
          /**
           * 路径匹配器,支持通配符
           * ? 匹配一个字符。不能匹配目录:这个字符不能是代表路径分隔符的/.
           * * 匹配0到多个字符.
           * ** 匹配多级目录.
           */
          public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              // 定义不需要处理的请求路径,将登录请求路径排除在外
              String[] urls = new String[]{
                      "/users/login"
              };
              HttpServletRequest request = (HttpServletRequest) servletRequest;
              HttpServletResponse response = (HttpServletResponse) servletResponse;
              //1、获取本次请求的URI
              String requestURI = request.getRequestURI();
              log.info("拦截到请求:{}", requestURI);
      
              //2、判断本次请求是否需要处理
              boolean check = check(urls, requestURI);
      
              //3、如果不需要处理,则直接放行
              if (check) {
                  log.info("本次请求{}不需要处理", requestURI);
                  filterChain.doFilter(request, response);
                  return;
              }
      
              //4、判断登录状态,如果已登录,则直接放行
              Long userId = (Long) request.getSession().getAttribute("user");
              if (userId != null) {
                  log.info("用户已登录,用户id为:{}", userId);
                  filterChain.doFilter(request, response);
                  return;
              }
      
              log.info("用户未登录");
              //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
              // 解决响应中文乱码问题
              response.setCharacterEncoding("utf-8");
              response.getWriter().write(JSON.toJSONString(ResultBean.error("用户未登录")));
          }
      
          /**
           * 路径匹配,检查本次请求是否需要放行
           *
           * @param urls
           * @param requestURI
           * @return
           */
          public boolean check(String[] urls, String requestURI) {
              for (String url : urls) {
                  boolean match = PATH_MATCHER.match(url, requestURI);
                  if (match) {
                      return true;
                  }
              }
              return false;
          }
      
      }
      

你可能感兴趣的:(java,spring,boot,java,后端)