springboot中的拦截器
时间: 2023-11-16 17:52:42 浏览: 104
拦截器是一种动态拦截方法调用的机制,在SpringMVC中用于拦截控制器方法的执行。在SpringBoot中,我们可以通过实现HandlerInterceptor接口来创建自己的拦截器。拦截器在请求的处理过程中,可以在请求到达控制器方法之前或之后执行预处理和后处理操作。与过滤器相比,拦截器更加灵活,可以针对SpringMVC的访问进行增强。
在SpringBoot中的拦截器中,preHandle()方法是在请求到达控制器方法之前执行的方法。它的返回值true和false的区别在于,如果返回true,则继续执行后续的拦截器和控制器方法;如果返回false,则中断请求的处理,不再执行后续的拦截器和控制器方法。
相关问题
springboot中拦截器,禁止用户访问/fillAll
在Spring Boot中,拦截器可以用于控制应用程序的行为,例如对特定请求路径进行权限检查、日志记录等。如果你想阻止用户访问`/fillAll`这个路径,你可以创建一个全局拦截器(Global Interceptor),通过`@Around`注解来实现自定义逻辑。
首先,你需要创建一个拦截器类,并让它满足`HandlerInterceptor`接口或者`WebMvcConfigurer`接口,以便注册到Spring MVC中:
```java
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class FillAllInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getRequestURI().equals("/fillAll")) {
// 如果请求路径是(fillAll),则返回403 Forbidden响应
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access to /fillAll is forbidden.");
return false; // 阻止后续处理
}
return true; // 允许继续处理请求
}
// ...其他方法,如postHandle和afterCompletion
}
```
然后,在Spring Boot应用的配置类中启用该拦截器:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(fillAllInterceptor).addPathPatterns("/fillAll"); // 只针对/fillAll路径
}
private FillAllInterceptor fillAllInterceptor = new FillAllInterceptor();
}
```
这样,当你尝试访问`/fillAll`时,就会触发拦截器并返回403 Forbidden错误,禁止了用户的访问。
springboot自定义拦截器
在 Spring Boot 中自定义拦截器可以通过实现 `HandlerInterceptor` 接口来实现。下面是一个简单的例子:
首先创建一个拦截器类 `MyInterceptor`,实现 `HandlerInterceptor` 接口:
```java
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Before handling the request");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("After handling the request and rendering the view");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("After completion of the request");
}
}
```
然后在配置类中注册拦截器:
```java
@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
```
在上面的例子中,我们在 `addInterceptors` 方法中注册了自定义的拦截器,并通过调用 `addPathPatterns` 方法指定了需要拦截的 URL 模式。这里我们使用了 `/**`,表示匹配所有的 URL。
当请求被拦截时,`preHandle` 方法会在请求处理之前被调用,`postHandle` 方法会在请求处理完成之后被调用,而 `afterCompletion` 方法会在响应已经被发送给客户端后被调用。我们可以在这些方法中添加自己的逻辑,例如记录日志、验证用户权限等。
阅读全文