登陆校验轻松搞定:SpringBoot拦截器实现校验指南

本文介绍了如何在Spring框架中使用@WebFilter实现前端请求的路径拦截,确保所有登录判断在后端进行,并通过AntPathMatcher进行路径匹配。着重讲解了doFilter方法的实现以及如何根据用户登录状态决定是否放行请求。
摘要由CSDN通过智能技术生成

以下所有内容均作为个人笔记,本人只是一名初学者,欢迎各位大佬指正。


前言

        该篇笔记整理自瑞吉外卖项目,仅为个人总结,如有错误,还请各位大佬指正。

        通过实现Filter接口中的doFilter方法,配合@WebFilter实现拦截请求路径。


内容

为保证安全性,所有的登陆判断都需要在后端进行,返回R.successful或者R.error,通过其中的codemessage判断用户是否登录。

逻辑如下:

1.过滤器配置注解

@WebFilter(filterName="拦截器类名首字母小写",urlPartten=“要拦截的路径,比如/*”)

@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")

2.实现Filter接口,重写doFilter方法

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //放行逻辑
}

参数:

  1. ServletRequest servletRequest

    • 这是一个表示HTTP请求的接口,它提供了对请求的各种信息的访问,如请求参数、头部信息、URI等。在doFilter方法中,可以使用ServletRequest来获取关于客户端请求的信息,以便进行适当的处理。

  2. ServletResponse servletResponse

    • 这是一个表示HTTP响应的接口,它提供了向客户端发送响应的方法,如设置响应状态码、响应头部、响应内容等。在doFilter方法中,可以使用ServletResponse来操作和定制服务器响应。

  3. FilterChain filterChain

    • FilterChain 用于在过滤器链中调用下一个过滤器,或者调用目标资源。过滤器链中的所有过滤器都会按照它们在web.xml文件或注解中的声明顺序执行。

    • doFilter方法中,可以调用filterChain.doFilter(servletRequest, servletResponse)来继续执行下一个过滤器或目标资源。

3.定义路径匹配与需放行url

AntPathMatcher 是 Spring Framework 提供的一个路径匹配器工具类。它用于执行基于 Ant 样式的路径模式匹配,类似于 Ant 构建工具中用于指定文件和目录的匹配模式。例如,/user/*/profile 可以匹配 /user/123/profile

//路径匹配器,支持通配符,可以匹配通配符。
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

添加需要放行的地址

//定义不需要处理的请求路径,无法直接放行带有【通配符】的请求路径,需要和AntPathMatcher配合使用
        String[] urls = new String[]{
               //放行地址,例如
                "/employ/login",
        };

4.获取请求的uri地址,判断是否需要放行。

//1.获取本次请求的uri
    String requestURI = request.getRequestURI();

判断函数

/**
     * 路径匹配,检查本次请求是否需要放行
     * @param urls
     * @param requestURI
     * @return 需要放行:true, 否则:false
     */
    public boolean check(String[] urls, String requestURI) {
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if(match) {
                return true;
            }
        }
        return false;
    }

5.执行拦截(非拦截)逻辑

        //3.如果不需要处理,则直接放行
        if(check) {
            filterChain.doFilter(request, response);
            return;
        }

        //4.判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee") != null) {
            filterChain.doFilter(request, response);
            return;
        }

        //5.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;

注意:报错No mapping for Get /employee/page可能是因为过滤器没有扫描,在启动类中加个@ServletCompomentScan


总结

完整代码示例

@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
//@Configuration
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();

        //定义不需要处理的请求路径
        String[] urls = new String[]{
                "/employee/login",
                "/common/**"
        };

        //2.判断本次请求是否需要处理
        boolean check = check(urls,requestURI);

        //3.如果不需要处理,则直接放行
        if(check) {
            filterChain.doFilter(request, response);
            return;
        }

        //4.判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee") != null) {
            Long id = (Long) request.getSession().getAttribute("employee");
            BaseContext.setCurrentId(id);
            filterChain.doFilter(request, response);
            return;
        }

        //5.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;
    }

    /**
     * 路径匹配,检查本次请求是否需要放行
     * @param urls
     * @param requestURI
     * @return 需要放行:true, 否则:false
     */
    public boolean check(String[] urls, String requestURI) {
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if(match) {
                return true;
            }
        }
        return false;
    }
}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值