JAVA RESTful WebService实战笔记(三)

本文详细介绍了JAVA RESTful WebService的请求流程和过滤器机制,包括ClientRequestFilter、ContainerRequestFilter、ContainerResponseFilter和ClientResponseFilter的使用场景和实现示例,展示了它们在请求和响应过程中的作用。
摘要由CSDN通过智能技术生成

前言

AOP(Aspect oriented Programming,面向切面编程),其实现原理就是代理被调用的方法,在其被执行的方法前后,增加额外的业务功能,AOP的实现机制就是通过注解或者XML配置,就这些配置,动态的生成字节码(bytecode).使被调用代码对应的字节码被环绕注入新的功能;或者使用Java的动态代理机制,完成对被调用方法的增强.

REST请求流程

在以下的图中,请求流程中存在3种角色,分别是用户、REST客户端和REST服务器。请求始于请求的发送,止于调用Response类的readeEntity()方法,获取响应实体。

image.png

  • 1、用户提交请求数据,客户端接收请求,进入第一个扩展点:”客户端请求过滤器ClientRequestFilter实现类“的filter()方法。
  • 2、请求过滤器处理完毕之后,流程进入第二个扩展点:”客户端写拦截器WriterInterceptor实现类”的aroundWriteTo()方法,实现对客户端序列化操作的拦截
  • 3、”客户端消息体写处理器MessageBodyWriter“执行序列化,流程从客户端过渡到服务器端
  • 4、服务器接收请求,流程进入第三个扩展点:”服务器前置请求过滤器ContainerRequestFilter实现类“的filter()方法。
  • 5、过滤处理完毕后,服务器根据请求匹配资源方法,如果匹配到相应的资源方法,流程进入第四个扩展点:”服务器后置请求过滤器ContainerRequestFilter实现类“的filter()方法
  • 6、后置请求过滤器处理完毕之后,流程进入第五个扩展点:”服务器读拦截器ReaderInterceptor实现类的”aroundReadFrom()方法,拦截服务器端反序列化操作
  • 7、”服务器消息体读处理器MessageBodyReader”完成对客户端数据流的反序列化。服务器执行匹配的资源方法
  • 8、REST请求资源处理完毕之后,流程进入第六个扩展点:”服务器相应过滤器ContainerResponseFilter实现类“的filter()方法
  • 9、过滤器处理完毕之后,流程进入第七个扩展点:”服务器写拦截器WriterInterceptor实现类“的aroundWriteTo()方法,对服务器端序列化到客户端这个操作的拦截
  • 10、”服务器消息体写处理器MessageBodyWriter“执行序列化,流程返回到客户端一侧。
  • 11、客户端接收响应,流程进入第八个扩展点:”客户端响应过滤器ClientResponseFilter实现类”的filter()方法
  • 12、过滤器处理完毕后,客户端响应实例response返回到用户一侧,用户执行response.readEntity()流程进入第九个扩展点:”客户端读取拦截器ReaderInterceptor实现类“的aroundReadFrom()方法,对客户端反序列化进行拦截
  • 13、”客户端消息体赌徒处理器MessageBodyReader”执行反序列化,将Java类型的对象最终作为readEntity()方法的返回值。到此,一次REST请求处理器的完整流程完毕
    这期间如果出现异常或者资源不匹配情况,会从出错点开始结束流程

REST过滤器

1、ClientRequestFilter
  • 客户端请求过滤器(ClientRequestFilter)定义的过滤方法filter()包含一个输入参数,是客户端请求的上下文类ClientRequestFilter。从该上下文中可以获取请求信息,典型的示例包括获取请求context.getMethod(),获取请求资源地址context.getUri()和获取请求头信息context.getHeaders()等。过滤器的实现类中可以利用这些信息,覆写改方法以实现特有的过滤功能。ClientRequestFilter接口的实现类如下:

image.png

2、ContainerRequestFilter
  • 针对过滤切面,服务器请求过滤接口ContainerRequestFilter的实现类可以定义为预处理和后处理,默认情况下,采用后处理方式。及先执行容器接收请求操作.当服务器接收并处理请求后.流程才进入过滤器实现类的filter()方法。而预处理是在服务器处理接收到的请求之前就执行过滤。如果希望实现一个预处理的过滤器实现类,需要在类名上定义注解@PreMatching
  • 服务器请求过滤器定义的过滤方法filter()包含一个输入参数,即容器请求上下文类ContainerRequestContext。ContainerRequestFilter接口的实现类如下:
    image.png

  • 如下代码展示了ContainerRequestFilter接口的实现类,我们以CsrfProtectionFilter为例来说明,示例代码如下所示:

public class CsrfProtectionFilter implements ClientRequestFilter {
   

    /**
     * Name of the header this filter will attach to the request.
     */
    public static
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值