When you encounter a problem in your project, you need to encrypt the data returned by the interface to the front end. Controllers in a project typically return an entity form, overriding a view parser that inherits Modelandviewresolver, and returns the returned form to the front end in JSON format.
View Resolver:
public class Jsonmodelandviewresolver implements Modelandviewresolver,initializingbean, Applicationcontextaware { Private String Defaultcontenttype = "text/html";p rivate log log = Logfactory.getlog (Super.getclass ());p rivate jsonserialization jsonserialization;private applicationcontext applicationcontext;public void AfterPropertiesSet () Throws Exception {if (this.jsonserialization! = null) Return;this.jsonserialization = Jsonserializationfactory.getinstance (This.applicationcontext);} public void Setapplicationcontext (ApplicationContext paramapplicationcontext) throws Beansexception { This.applicationcontext = Paramapplicationcontext;} Execute this method public Modelandview Resolvemodelandview (method Parammethod,class Paramclass, Object Paramobject, Extendedmodelmap paramextendedmodelmap,nativewebrequest paramnativewebrequest) {if (Rest.class.isAssignableFrom ( Paramclass)) {try {httpservletresponse localhttpservletresponse = (httpservletresponse) Paramnativewebrequest.getnativeresponse (HttpServletResponse. Class); Responsejson (Paramobject, localhttpservletresponse);} catch (IOException localioexception) {throw new WebException (Localioexception.getmessage (), localioexception);} return null;} return unresolved;} public void Responsejson (Object paramobject,httpservletresponse paramhttpservletresponse) throws IOException {if (!) ( Stringutils.hastext (Paramhttpservletresponse.getcontenttype ()))) Paramhttpservletresponse.setcontenttype ( This.defaultcontenttype); String str = writeresult (paramobject); PrintWriter localprintwriter = Paramhttpservletresponse.getwriter (), if (this.log.isInfoEnabled ()) This.log.info (" Rest result= "+ str"), if ("{}". Equals (str)) {this.log.info ("image stream is not write"); return;} Localprintwriter.write (str); Localprintwriter.flush ();} Protected string Writeresult (Object paramobject) {string str = null;if (Paramobject = = null) {str = ' {} ';} else if ((param Object instanceof number) | | (Paramobject instanceof Boolean)) {str = "{\" resultcode\ ": \" "+ paramobject.tostring () +" \ "}";} Else if (paramobject instanceof String)) {string result = (string) Paramobject;str = result;} else {if (Paramobject Instanceo F modelandview) Paramobject = ((Modelandview) paramobject). Getmodel (); str = Getjsonserialization (). toJSONString ( Paramobject);} return str;} Public String Getdefaultcontenttype () {return this.defaultcontenttype;} public void Setdefaultcontenttype (String paramstring) {this.defaultcontenttype = paramstring;} Public jsonserialization getjsonserialization () {return this.jsonserialization;} public void Setjsonserialization (jsonserialization paramjsonserialization) {this.jsonserialization = Paramjsonserialization;}}
Originally consider directly modify the view parser, the return JSON string encryption, but found that some interfaces in the project directly in the controller through the PrintWriter returned parameters, obviously this method is not intercepted.
Finally, the way to re-export to the frontend is encrypted by httpservletresponsewrapper interception of the return data stream.
The code references are as follows:
Responsewrapper:
Package Com.paic.egis.smts.toa.web.interceptor;import Java.io.chararraywriter;import Java.io.IOException;import Java.io.printwriter;import Javax.servlet.http.httpservletresponse;import Javax.servlet.http.httpservletresponsewrapper;import Com.paic.egis.smts.common.util.loggerutil;public Class Responsewrapper extends Httpservletresponsewrapper {private PrintWriter cachedwriter;private Chararraywriter Bufferedwriter;public Responsewrapper (httpservletresponse response) throws IOException {super (response); BufferedWriter = new Chararraywriter (); cachedwriter = new PrintWriter (bufferedwriter);} Public PrintWriter getwriter () throws IOException {return cachedwriter;} public string GetResult () {byte[] bytes = bufferedwriter.tostring (). GetBytes (); try {return new String (bytes, "UTF-8");} C Atch (Exception e) {loggerutil.logerror (This.getclass (). GetName (), "GetResult", e); return "";}}
Filters are as follows:
Package Com.paic.egis.smts.toa.web.filter;import Java.io.ioexception;import Java.io.printwriter;import Javax.servlet.filter;import Javax.servlet.filterchain;import Javax.servlet.filterconfig;import Javax.servlet.servletexception;import Javax.servlet.servletrequest;import Javax.servlet.servletresponse;import Javax.servlet.http.httpservletresponse;import Com.alibaba.dubbo.common.utils.stringutils;import Com.paic.egis.smts.common.util.loggerutil;import Com.paic.egis.smts.common.util.propertiesutil;import Com.paic.egis.smts.pama.security.base64utils;import Com.paic.egis.smts.toa.web.interceptor.ResponseWrapper; Import Com.paic.egis.smts.trusteesship.util.rsacoder;public class Responsewrapperfilter implements Filter {public void Destroy () {}public void DoFilter (ServletRequest req, servletresponse resp,filterchain chain) throws IOException, Ser vletexception {String Version = Req.getparameter ("version"), if (Stringutils.isempty (version)) {Chain.dofilter (req, RESP);} else {HttpServletResponse respOnse = (httpservletresponse) resp; Responsewrapper Mr = new Responsewrapper (response); Chain.dofilter (req, MR); PrintWriter out = Resp.getwriter (); try {//Fetch the JSON string returned by string result = Mr.getresult (); SYSTEM.OUT.PRINTLN (result);//encrypt string encryptstr = Encryptrsa (result); Out.write (ENCRYPTSTR); } catch (Exception e) {loggerutil.logerror (This.getclass (). GetName (), "DoFilter", e);} finally {Out.flush (); Out.close (); }}} @Overridepublic void init (Filterconfig filterconfig) throws servletexception {}//rsa public key crypto-String Encryptrsa ( String content) throws exception{string Publickeystr = Propertiesutil.getproperty ("Response.publickey"); byte[] Encryptbytes = Rsacoder.encrypt (Content.getbytes ("Utf-8"), Publickeystr, "public"), Return Base64utils.encode ( encryptbytes);}}
Modifying the response output stream with Httpservletresponsewrapper