几种拦截器的使用选择

一般说到拦截器我们就想到实现HandlerInterceptor,并同时配置拦截器的顺序和拦截条件即可。这种属于MVC的拦截器。如下
@Component
public class LoginInterceptor implements HandlerInterceptor {

    /**
  • 拦截器为调用方法执行之前执行的方法

  • @param request 请求

  • @param response 响应

  • @param handler 表示要执行的处理器, 即处理请求的 Controller 对象或者是拦截器的对象

  • @return true 拦截器验证成功, 继续执行后续操作

  • false 拦截器验证失败, 验证未通过后续流程不执行

  • @throws Exception 异常
    */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

          // 用户登录判断
          HttpSession session = request.getSession(false);
          if (session != null && session.getAttribute("session_userinfo") != null) {
              // 该用户已经登陆
              return true;
          }
          // 请求无权限, 返回状态码提示
          response.setStatus(401);
          return false;
      }
    

    }

@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {

    // 将自定义的拦截器注入
    @Autowired
    private LoginInterceptor interceptor;

    /**
  • @param registry 注册对象
    */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

          // 注册对象将拦截器添加进框架中
          registry.addInterceptor(interceptor)
              // 配置拦截规则
              .addPathPatterns("/**") // 拦截所有的 url
              .excludePathPatterns("/user/reg") // 排除用户注册 url
              .excludePathPatterns("/user/login") // 排除用户登陆 url
              .excludePathPatterns("/image/**"); // 排除 image 文件夹底下的所有文件
      }
    

    }

但是实际开发过程中,会有一些特殊的拦截需求
第一种,拦截某些特定的方法,
例子:
public class KafkaListenerInterceptor implements MethodInterceptor {

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
	//执行前要做的。
    setShardedCode(invocation);
    return invocation.proceed();
}

private void setShardedCode(MethodInvocation invocation) {
 //执行前要做的。
}

}

配置



shardedDataSourceHelperBiz




defaultShardedDataSourceInterceptor


第二种,对所有的请求过滤,当然此处也可以使用其他过滤器,这种事比较针对的
ublic class RestRequestFilter implements ContainerRequestFilter {

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
  
}

}

第三种:对所有对外访问的请求进行拦截,主要针对对外访问时请求头的处理
public class RestRequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
HttpHeaders headers = request.getHeaders();
headers.add(“locale”, messageConfig.getLocaleString());
return execution.execute(request, body);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值