登录功能完善

登录功能完善

  1. 问题分析
    + 登录功能已经实现,但是存在一个问题:用户如果不登录,直接访问系统首页,照样可以正常访问。
    + 这种设计不合理,我们希望看到效果应该是,只有登录成功后才可以访问系统中的页面,如果没有登录则跳转到登录页面。
    + 那么怎么具体实现呢?
    + 使用过滤器或者拦截器,在过滤器或拦截器中判断用户是否已经完成登录,如果没有跳转到登录页面。
  2. 实现步骤:
    + 创建自定义过滤器LoginCheckFilter
@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")//利用过滤器拦截,拦截所有的请求  urlPatterns = "/*"
@Slf4j
public class LoginCheckFilter implements Filter {
    //路径匹配器,并支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;


        //1. 获取本次请求的URI
        String requestURI = request.getRequestURI();
        //如果请求路径为"/backend/index.html"会与放行的"/backend/**"路径匹配不上,会导致无法识别,这时需要路径匹配器
        log.info("拦截到的请求:{}",requestURI);

        //1.2 定义不需要处理的请求路径,比如:登录页面,退出,静态资源,主要是拦截controller资源
        String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };
        //2. 判断本次请求是否需要处理,封装一个方法类进行比较
        boolean check = check(urls, requestURI);
        //3. 如果不需要处理,则直接放行
        if (check) {
            log.info("本次请求{}不需要处理",requestURI);
            filterChain.doFilter(request,response);//放行
            return;
        }
        //   4. 判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee")!=null){
            log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
            //已经登录,直接放行
            filterChain.doFilter(request,response);//放行
            return;
        }
        //5. 如果未登录则返回未登录结果,通过输出流的方式向客户端响应数据
        log.info("用户未登录");
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));

        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;
    }
+ 在启动类上加入注解@ServletComponentScan
@ServletComponentScan //实现过滤器,创建过滤器的实例
public class ReggieApplication {
    public static void main(String[] args) {
        SpringApplication.run(ReggieApplication.class,args);
        log.info("项目启动成功。。。");
    }
}

你可能感兴趣的:(SprinBoot,java,servlet,前端)