下面详细讲解一下“springMVC拦截器HandlerInterceptor用法代码示例”的完整攻略。
什么是HandlerInterceptor?
HandlerInterceptor是Spring MVC框架的拦截器,用于在controller处理请求之前和之后进行一些额外的处理。HandlerInterceptor是一个接口,需要自定义实现它,并将其注册为Spring中的Bean,以便在需要的地方执行。
HandlerInterceptor有三个拦截点:
- 在Controller之前执行preHandle()方法
- 在Controller之后,视图渲染之前执行postHandle()方法
- 在整个请求完成之后执行afterCompletion()方法
HandlerInterceptor的使用方法
1. 自定义HandlerInterceptor
HandlerInterceptor接口需要实现三个方法,它们的作用分别是:
-
preHandle:该方法在Controller处理请求之前调用,返回值为true表示继续处理,返回false表示请求结束。
-
postHandle:该方法在Controller处理请求之后,但在渲染视图之前调用。
-
afterCompletion:该方法在整个请求完成之后调用,通常用于清理资源等操作。
以下是一个自定义的HandlerInterceptor示例:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle method is calling");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle method is calling");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
System.out.println("afterCompletion method is calling");
}
}
2. 注册HandlerInterceptor
要使用HandlerInterceptor,需要将其注册为Spring中的Bean。可以通过配置文件或Java代码将其注册。这里使用Java代码的方式进行注册。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
在上面的代码中,addInterceptor() 方法用于添加自定义的 HandlerInterceptor。addPathPatterns() 方法用于设置处理拦截器的路径模式,这里表示所有请求都会被拦截器处理。
3. 测试HandlerInterceptor
最后,我们需要测试一下 HandlerInterceptor 是否已经被正确配置。我们可以创建一个简单的Controller来测试拦截器是否被调用。
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, world!";
}
}
如果一切正常,当我们访问 /hello 时,MyInterceptor 的 preHandle() 方法会被调用,并输出一条日志信息:
preHandle method is calling
HandlerInterceptor示例说明
下面我们以两个示例的方式说明 HandlerInterceptor 的使用方法。
示例一:实现用户登录拦截器
假设我们设计了一个在线商城的网站,用户需要登录才能购买商品。为了实现这个功能,我们可以写一个拦截器来检查用户是否已经登录。
首先,我们需要在登录成功之后,将用户信息存储在 Session 中。在之后的每个请求中,我们可以通过检查 Session 中是否存在用户信息来判断用户是否已经登录。如果 Session 中不存在用户信息,我们就重定向到登录页面。
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object obj = session.getAttribute("user");
if (obj == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
在上面的代码中,我们实现了 LoginInterceptor 类,并覆盖了 preHandle() 方法。在该方法中,我们首先获取 HttpSession 对象,并通过 session.getAttribute("user") 方法获取用户信息。如果用户信息不存在,我们就重定向到登录页面。
然后我们需要在 WebMvcConfigurerAdapter 中注册该拦截器:
@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/order", "/cart");
}
}
在上面的代码中,我们使用 addInterceptor() 方法注册 LoginInterceptor,并使用 addPathPatterns() 方法指定拦截路径,这里我们拦截了 /order 和 /cart 请求。
最后我们编写一个简单的 Controller 类进行测试:
@RestController
public class OrderController {
@GetMapping("/order")
public String order() {
return "Please login first.";
}
@GetMapping("/cart")
public String cart() {
return "Please login first.";
}
}
如果用户已经登录,访问 /order 或 /cart 将会返回页面内容。如果用户没有登录,这些请求将会被重定向到登录页面。
示例二:实现IP地址限制拦截器
假设我们需要进行限制,使得仅特定IP地址能够访问我们的某些接口。我们可以编写一个拦截器来检查请求的 IP 地址是否合法,如果不合法,就返回一个错误信息或直接拒绝该请求。
public class IPInterceptor implements HandlerInterceptor {
private List<String> allowedIPs;
public IPInterceptor(List<String> allowedIPs) {
this.allowedIPs = allowedIPs;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ipAddress = request.getRemoteAddr();
if (!allowedIPs.contains(ipAddress)) {
response.getWriter().println("Your IP address is not allowed to access the website.");
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
return true;
}
}
在上面的代码中,我们实现了 IPInterceptor 类,并覆盖了 preHandle() 方法。在该方法中,我们首先获取请求的 IP 地址,然后比对它是否在白名单之内,如果不在就直接拒绝该请求。
然后我们需要在 WebMvcConfigurerAdapter 中注册该拦截器:
@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
@Value("${ip.white.list}")
private String[] allowedIPs;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new IPInterceptor(Arrays.asList(allowedIPs))).addPathPatterns("/admin/**");
}
}
在上面的代码中,我们使用 addInterceptor() 方法注册 IPInterceptor,并使用 addPathPatterns() 方法指定需要拦截的路径,这里我们拦截了 /admin/ 目录下的所有请求。
最后我们编写一个简单的 Controller 类进行测试:
@RestController
@RequestMapping("/admin")
public class AdminController {
@GetMapping("/users")
public String users() {
return "List of all users.";
}
@GetMapping("/orders")
public String orders() {
return "List of all orders.";
}
}
如果用户的IP地址在白名单内,访问 /admin/users 或 /admin/orders 将会返回页面内容。如果用户的IP地址不在白名单内,将会返回一个错误信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springMVC拦截器HandlerInterceptor用法代码示例 - Python技术站