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