栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring MVC:如何修改从控制器发送的json响应

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring MVC:如何修改从控制器发送的json响应

我遇到过类似的问题,建议您使用Servlet过滤器来解决它。

Servlet过滤器是Java类,可以在Servlet编程中使用这些Java类在客户端访问后端资源之前拦截来自客户端的请求,或者在将服务器发送回客户端之前操纵来自服务器的响应。

您的过滤器必须实现javax.servlet.Filter接口并重写三个方法:

public void doFilter (ServletRequest, ServletResponse, FilterChain)

每当客户端对链末端的资源提出请求时,每次通过该链通过一个请求/响应对时都会调用此方法。

public void init(FilterConfig filterConfig)

在过滤器投入使用之前调用,并设置过滤器的配置对象。

public void destroy()

在过滤器停止使用后调用。

可以使用任意数量的过滤器,执行的顺序将与在web.xml中定义的顺序相同。

web.xml:

...<filter>    <filter-name>restResponseFilter</filter-name>    <filter-class>        com.package.filters.ResponseFilter    </filter-class></filter><filter>    <filter-name>anotherFilter</filter-name>    <filter-class>        com.package.filters.AnotherFilter    </filter-class></filter>...

因此,此过滤器获取控制器响应,将其转换为String,将其作为字段添加到RestResponse类对象(带有状态和消息字段)中,将其对象序列化为Json并将完整的响应发送给客户端。

ResponseFilter类:

public final class ResponseFilter implements Filter {@Override    public void init(FilterConfig filterConfig) {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,          FilterChain chain) throws IOException, ServletException {    ResponseWrapper responseWrapper = new ResponseWrapper((HttpServletResponse) response);    chain.doFilter(request, responseWrapper);    String responseContent = new String(responseWrapper.getDataStream());    RestResponse fullResponse = new RestResponse(, ,responseContent);    byte[] responseToSend = restResponseBytes(fullResponse);    response.getOutputStream().write(responseToSend);}@Overridepublic void destroy() {}private byte[] restResponseBytes(RestResponse response) throws IOException {    String serialized = new ObjectMapper().writevalueAsString(response);    return serialized.getBytes();}}

chain.doFilter(request,responseWrapper)方法调用链中的下一个过滤器,或者如果调用的过滤器是链中的最后一个过滤器,则调用servlet逻辑。

HTTP
servlet响应包装器使用自定义servlet输出流,该输出流使包装器在servlet完成写出响应数据后即可处理响应数据。通常,在关闭servlet输出流之后(基本上是在servlet提交之后),无法完成此操作。这就是对ServletOutputStream类实现特定于过滤器的扩展的原因。

FilterServletOutputStream类:

public class FilterServletOutputStream extends ServletOutputStream {DataOutputStream output;public FilterServletOutputStream(OutputStream output) {    this.output = new DataOutputStream(output);}@Overridepublic void write(int arg0) throws IOException {    output.write(arg0);}@Overridepublic void write(byte[] arg0, int arg1, int arg2) throws IOException {    output.write(arg0, arg1, arg2);}@Overridepublic void write(byte[] arg0) throws IOException {    output.write(arg0);}}

要使用FilterServletOutputStream类,应实现一个可用作响应对象的类。该包装对象将代替Servlet生成的原始响应发送回客户端。

ResponseWrapper类:

public class ResponseWrapper extends HttpServletResponseWrapper {ByteArrayOutputStream output;FilterServletOutputStream filterOutput;HttpResponseStatus status = HttpResponseStatus.OK;public ResponseWrapper(HttpServletResponse response) {    super(response);    output = new ByteArrayOutputStream();}@Overridepublic ServletOutputStream getOutputStream() throws IOException {    if (filterOutput == null) {        filterOutput = new FilterServletOutputStream(output);    }    return filterOutput;}public byte[] getDataStream() {    return output.toByteArray();}}

我认为这种方法将是解决您问题的好方法。

请问一个问题,如果不清楚,请纠正我,如果我错了。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/449225.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号