Java拦截器preHandle方法的使用及跳过某个接口
拦截器是Java Web开发中常用的一种技术,可以拦截用户请求并在处理请求之前进行一些操作,比如身份验证、权限控制等。在Spring框架中,使用拦截器可以很方便地实现这些功能。在拦截器的preHandle方法中,我们可以根据需要来判断是否要拦截某个接口。
1. 创建拦截器类
首先,我们需要创建一个拦截器类,实现HandlerInterceptor接口并重写其中的方法。在这个例子中,我们以验证用户登录状态为例,创建一个LoginInterceptor类。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在这里编写拦截器的逻辑
// 判断用户是否登录,如果未登录则跳转到登录页面
if (!isLoggedIn()) {
response.sendRedirect("/login");
return false; // 返回false表示拦截该请求
}
return true; // 返回true表示放行该请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 在请求处理之后调用,但是在视图被渲染之前,可以对ModelAndView进行操作
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 在整个请求处理完毕之后被调用,可以用于清理资源等操作
}
private boolean isLoggedIn() {
// 判断用户是否登录的逻辑
// 返回true表示已登录,返回false表示未登录
}
}
在上述代码中,我们重写了preHandle方法,在其中编写了拦截器的逻辑。首先,我们判断用户是否已登录,如果未登录,则调用response的sendRedirect方法将请求重定向到登录页面,并返回false表示拦截该请求。如果用户已登录,则返回true表示放行该请求。
2. 注册拦截器
接下来,需要在Spring配置文件中注册拦截器,以确保拦截器能够起作用。在这个例子中,我们以Spring Boot为例,创建一个WebMvcConfig类来注册拦截器。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册拦截器并设置拦截路径
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
}
}
在上述代码中,我们通过调用addInterceptor方法来注册拦截器,并使用addPathPatterns方法设置拦截路径。在这个例子中,我们将拦截所有的请求。
3. 跳过某个接口
有时候,我们可能需要跳过某个接口的拦截器验证,例如登录接口。在拦截器的preHandle方法中,我们可以通过判断请求的路径来决定是否跳过拦截器的验证。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 获取请求的路径
String uri = request.getRequestURI();
// 判断请求的路径是否为登录接口
if (uri.equals("/login")) {
return true; // 跳过拦截器的验证,放行该请求
}
// 在这里编写拦截器的逻辑
// 判断用户是否登录,如果未登录则跳转到登录页面
if (!isLoggedIn()) {
response.sendRedirect("/login");
return false; // 返回false表示拦截该请求
}
return true; // 返回true表示放行该请求
}
在上述代码中,我们获取请求的路径,并判断该路径是否为登录接口。如果是登录接口,则直接返回true,表示跳过拦截器的验证,放行该请求。如果不是登录接口,则继续执行拦截器的逻辑。