filter拦截问题

写一个分为客户端和管理端的项目的时候,我写了一个filter拦截器,里面写了拦截客户端和管理端未登陆的情况下实施拦截的代码,可当我一旦客户端登录了,我的管理端不用登陆也能进去,当管理端登录了,客户端不用登陆也能进去,请问一下如何处理这个问题,从而达到分别拦截的效果呢?

在实现拦截器时,可以为不同的请求路径设置不同的拦截规则。具体来说,在 doFilter 方法中可以根据请求路径进行判断,并针对客户端和管理端分别处理。

例如,假设客户端的请求路径以 /client/ 开头,管理端的请求路径以 /admin/ 开头,可以按照以下方式编写拦截器:

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getRequestURI();
        if (url.startsWith("/client/")) {
            // 处理客户端请求
            HttpSession session = request.getSession();
            Object user = session.getAttribute("clientUser");
            if (user == null) {
                // 跳转到登录页面
                response.sendRedirect("/client/login");
                return false;
            }
        } else if (url.startsWith("/admin/")) {
            // 处理管理端请求
            HttpSession session = request.getSession();
            Object user = session.getAttribute("adminUser");
            if (user == null) {
                // 跳转到登录页面
                response.sendRedirect("/admin/login");
                return false;
            }
        }
        
        return true;
    }

}

上述代码中,首先获取当前的请求路径 url,然后根据路径前缀判断是客户端请求还是管理端请求。如果是客户端请求,则从 HttpSession 中获取客户端用户信息,如果未登录则跳转到客户端登录页面;如果是管理端请求,则从 HttpSession 中获取管理端用户信息,如果未登录则跳转到管理端登录页面。注意,如果用户已经登录,则直接放行请求,不再执行后续操作。

在配置拦截器时,可以通过 addPathPatterns 方法指定需要拦截的请求路径,例如:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/client/**")  // 拦截客户端请求
                .addPathPatterns("/admin/**");  // 拦截管理端请求
    }

}

在上述示例中,将拦截器 loginInterceptor 配置为拦截 /client/** 和 /admin/** 开头的请求路径,从而实现客户端和管理端的区分拦截。