过滤器修改response的返回值
1. 继承httpservletresponsewrapper
重新覆盖response对象,用来获取response中的返回值
package com.example.demo.wrapper; import javax.servlet.servletoutputstream; import javax.servlet.writelistener; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpservletresponsewrapper; import java.io.*; public class responsewrapper extends httpservletresponsewrapper { private bytearrayoutputstream buffer = null; private servletoutputstream out = null; private printwriter writer = null; public responsewrapper(httpservletresponse resp) throws ioexception { super(resp); buffer = new bytearrayoutputstream();// 真正存储数据的流 out = new wapperedoutputstream(buffer); writer = new printwriter(new outputstreamwriter(buffer)); } @override public servletoutputstream getoutputstream() throws ioexception { return out; } @override public printwriter getwriter() throws unsupportedencodingexception { return writer; } @override public void flushbuffer() throws ioexception { if (out != null) { out.flush(); } if (writer != null) { writer.flush(); } } @override public void reset() { buffer.reset(); } public byte[] getresponsedata() throws ioexception { flushbuffer(); return buffer.tobytearray(); } public string getcontent() throws ioexception { flushbuffer(); return buffer.tostring(); } private class wapperedoutputstream extends servletoutputstream { private bytearrayoutputstream bos = null; public wapperedoutputstream(bytearrayoutputstream stream) throws ioexception { bos = stream; } @override public void write(int b) throws ioexception { bos.write(b); } @override public void write(byte[] b) throws ioexception { bos.write(b, 0, b.length); } @override public void write(byte[] b, int off, int len) throws ioexception { bos.write(b, off, len); } @override public boolean isready() { return false; } @override public void setwritelistener(writelistener writelistener) { } } }
2、创建过滤器
修改response中的内容,返回
package com.example.demo.filter; import com.example.demo.wrapper.responsewrapper; import org.apache.commons.lang.stringutils; import org.springframework.http.mediatype; import org.springframework.stereotype.component; import javax.servlet.*; import javax.servlet.http.httpservletresponse; import java.io.ioexception; import java.io.outputstream; import java.io.printwriter; @component public class responsefilter implements filter { @override public void init(filterconfig filterconfig) throws servletexception { } @override public void destroy() { } @override public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception { responsewrapper responsewrapper = new responsewrapper((httpservletresponse) servletresponse); filterchain.dofilter(servletrequest, responsewrapper); string contenttype = responsewrapper.getcontenttype(); byte[] content = responsewrapper.getresponsedata(); string str=""; if (stringutils.isnotblank(contenttype) && (contenttype.contains(mediatype.application_json_value) || contenttype.contains(mediatype.text_html_value))) { str = new string(content); str=str+"xiaoming"; system.out.println("filter:"+str); httpservletresponse response=(httpservletresponse)servletresponse; writeresponse(response,200,str); } } public static void writeresponse(httpservletresponse response, int status, string json) { try { response.reset();//很重要 response.setheader("access-control-allow-origin", "*"); response.setheader("access-control-allow-methods", "*"); response.setcontenttype("application/json;charset=utf-8"); response.setstatus(status); response.getwriter().write(json); } catch (ioexception e) { e.printstacktrace(); } } }
3、配置过滤器
package com.example.demo.config; import com.example.demo.filter.responsefilter; import org.springframework.beans.factory.annotation.autowired; import org.springframework.boot.springbootconfiguration; import org.springframework.boot.web.servlet.filterregistrationbean; import org.springframework.context.annotation.bean; import java.util.arraylist; import java.util.list; @springbootconfiguration public class filterconfig { @autowired private responsefilter responsefilter; @bean public filterregistrationbean getfilterconfig(){ filterregistrationbean filterregistrationbean=new filterregistrationbean(); filterregistrationbean.setfilter(responsefilter); list<string> filterlist=new arraylist<>(); filterlist.add("/*"); filterregistrationbean.seturlpatterns(filterlist); return filterregistrationbean; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论