需求:用户在前端登录,后端将用户信息存储在session中,通过拦截每个接口请求,判断用户是否登录,若session中存在用户信息,则放行请求,若session中不存在用户信息,则拦截请求。

Filter过滤器简介

过滤器: Filter, 是 Servlet 技术中最实用的技术。
过滤器是处于客户端和服务器之间的一个过滤网,可以过滤掉一些不符合要求的请求。

常见场景: 
	Session 校验
	判断用户权限
	不符合设定条件,则会被重定向特殊的地址或者设定的响应
	过滤敏感词汇
	设置编码

核心过滤器代码

import javax.servlet.*;
import java.io.IOException;
import javax.servlet.http.HttpSession;
import javax.servlet.annotation.WebFilter;

import cn.hutool.core.util.ObjectUtil;
import org.apache.catalina.connector.RequestFacade;
import org.springframework.stereotype.Component;

@Component
@WebFilter(filterName = "authFilter", urlPatterns = "/*")
public class AuthFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        String requestUri = ((RequestFacade) request).getRequestURI();
        if (requestUri.equals("/")) {
            requestUri = "/rootDir";
        }

        boolean allowedPath = requestUri.contains("assets")
                || requestUri.contains("txt")
                ||  requestUri.contains("js")
                || requestUri.contains("png")
                || requestUri.contains("ico")
                || requestUri.contains("html")
                || requestUri.contains("css")
                || requestUri.contains("/rootDir")
                || requestUri.contains("/user/login");

        if (allowedPath) {
            chain.doFilter(request, response);
        } else {
            HttpSession session = ((RequestFacade) request).getSession();
            if (ObjectUtil.isEmpty(session.getAttribute("loginUser"))) {
               request.getRequestDispatcher("/error/loginExpired").forward(request, response);
            } else {
                chain.doFilter(request, response);
            }
        }
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐