实现浏览页面时校验用户是否已经完成登录的功能

一.实现原理

实现步骤:

1、创建自定义过滤器LoginWebFilter.java

2、在启动类上加入注解@ServletComponentScan,用来扫描web相关的注解

3、完善过滤器的处理逻辑

二.代码实现

首先在main/java/下创建一个filter文件夹用来存储所有过滤器的文件,在此文件夹下创建一个LoginWebFilter.java

实现浏览页面时校验用户是否已经完成登录的功能_第1张图片

 接下来在启动类上加入注解@ServletComponentScan,用来扫描web相关的注解

实现浏览页面时校验用户是否已经完成登录的功能_第2张图片

最后 完善过滤器的处理逻辑

过滤器的处理逻辑

实现浏览页面时校验用户是否已经完成登录的功能_第3张图片

 LoginWebFilter类

package com.itheima.regiee.filter;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.itheima.regiee.common.R;
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;

/**
 * 检测员工是否登录
 */

@WebFilter(filterName = "loginWebFilter",urlPatterns = "/*")
@Slf4j
public class LoginWebFilter implements Filter {
    private static AntPathMatcher pathMatcher=new AntPathMatcher(); //uri自动匹配
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) servletRequest;  //强制转换为Httpservlet
        HttpServletResponse response=(HttpServletResponse) servletResponse;
        /**
         * 1、获取本次请求的URI
         * 2、判断本次请求是否需要处理
         * 3、如果不需要处理,则直接放行
         * 4、判断登录状态,如果已登录,则直接放行
         * 5、如果未登录则返回未登录结果
         */
        //1、获取本次请求的URl
        String requestUrl=request.getRequestURI();

        //需要定义放行的请求
        String[] uris=new String[]{  //这些请求都需要放行
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };
        //2、判断本次请求是否需要处理
        boolean flag=check(uris,requestUrl);
        if(flag){  //本次请求直接放行
          filterChain.doFilter(request,response);
          return;  //如果本次请求不拦截,直接不用走后面的代码了
        }

        //long id = (long)request.getSession().getAttribute("employee");
        //4、判断登录状态,如果已登录,则直接放行,这个attribute是记录是否已经登录的
        if(request.getSession().getAttribute("employee")!=null){  //说明已经登录了
            filterChain.doFilter(request,response);
            return;
        }

        //5、如果未登录则返回未登录结果
        //设置返回json格式,可以看到res.data.msg就是返回的输出流
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;
    }

    /**
     * 路径匹配,如果检验本次请求是否需要放行
     * @param uris
     * @param requestUrl
     * @return
     */
    public boolean check(String[] uris,String requestUrl){
        for (String s : uris) {  //请求的url地址看是否需要放行,其中urlis中的资源都是需要放行的
            boolean flag=pathMatcher.match(s,requestUrl);
            if(flag){  //匹配上了,说明请求的资源需要放行
                return  true;
            }
        }
          return false;  //说明请求的地址是不能放行的
    }
}

R的工具类

package com.itheima.regiee.common;

import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/*
* 通用返回结果,服务端响应的数据最终都会封装成此对象
* */
@Data
public class R {

    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据

    private Map map = new HashMap(); //动态数据

    public static  R success(T object) {
        R r = new R();
        r.data = object;
        r.code = 1;
        return r;
    }

    public static  R error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public R add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

}

前端vue.js

实现浏览页面时校验用户是否已经完成登录的功能_第4张图片

 

 

你可能感兴趣的:(servlet)