SpringBoot项目中使用拦截器进行请求的拦截

在没有拦截器拦截前端请求的情况下,即使用户不进行登录,却依然能够进入系统。这显然是不合理的。这里使用拦截器对其请求进行一个拦截并且过滤。将那些需要需要用户登录才能够展示的界面进行一个拦截,如果用户没有登录,就需要跳转到登录界面进行登录。

没有拦截器的效果展示

此时我们没有登录,但是在访问http://localhost:8080/backend/index.html时依然可以成功访问。

添加拦截器的思路分析

在未登录的情况下需要返回什么信息,需要结合前端的处理。如下图所示,如果未登录,需要给前端传一个"NOTLOGIN"。

代码实现
自定义过滤器:自定义一个过滤器 LoginCheckFilter 并实现 Filter 接口, 在doFilter方法中完成校验的逻辑。

点击查看代码
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
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;

        //获取本次请求的路径
        String requestURI = request.getRequestURI();
        //定义不需要拦截的路径
        List<String> noFilterUris = new ArrayList<>();
        noFilterUris.add("/employee/login");
        noFilterUris.add("/employee/logout");
        noFilterUris.add("/backend/**");
        noFilterUris.add("/front/**");
        //判断本次请求是否需要被拦截
        for (int i = 0; i < noFilterUris.size(); i++) {
            String noFilterUri = noFilterUris.get(i);
            if (PATH_MATCHER.match(noFilterUri,requestURI)){
                log.info("本次请求不需要处理--->"+requestURI);
                filterChain.doFilter(request,response);
                return;
            }
        }
        //判断用户是否登录
        if (request.getSession().getAttribute("employee")!=null){
            log.info("用户已登录");
            filterChain.doFilter(request,response);
            return;
        }
        //用户未登录,通过输出流的方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;
    }
}
代码部分完成后还要在启动类上添加@ServletComponentScan注解。作用是:在SpringBoot项目中, 在引导类/配置类上加了该注解后, 会自动扫描项目中(当前包及其子包下)的@WebServlet , @WebFilter , @WebListener 注解, 自动注册Servlet的相关组件 ;

AntPathMatcher 拓展:
介绍: Spring中提供的路径匹配器 ;

posted @ 2023-05-31 10:11  wzh_Official  阅读(1111)  评论(0编辑  收藏  举报