写一个分为客户端和管理端的项目的时候,我写了一个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/** 开头的请求路径,从而实现客户端和管理端的区分拦截。