Lailaaaaa 2023-03-17 11:56 采纳率: 50%
浏览 10
已结题

filter拦截问题

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

  • 写回答

1条回答 默认 最新

  • Tigerfafa 2023-03-17 12:07
    关注

    在实现拦截器时,可以为不同的请求路径设置不同的拦截规则。具体来说,在 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/** 开头的请求路径,从而实现客户端和管理端的区分拦截。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月17日
  • 创建了问题 3月17日