天天看點

Java注解配置rest服務_spring mvc 自定義注解ResponseEncryptBody、RequestDecryptBody統一處理加密、解密資料,供移動端使用的rest服務...

package com.doctor.springmvc.extend;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.lang.reflect.Type;

import java.util.ArrayList;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.beans.factory.InitializingBean;

import org.springframework.http.HttpHeaders;

import org.springframework.http.HttpInputMessage;

import org.springframework.http.HttpOutputMessage;

import org.springframework.http.converter.HttpMessageNotReadableException;

import org.springframework.http.converter.HttpMessageNotWritableException;

import org.springframework.web.method.support.HandlerMethodArgumentResolver;

import org.springframework.web.method.support.HandlerMethodReturnValueHandler;

import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.support.config.FastJsonConfig;

import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4;

public class DecryptEncryptFastJsonHttpMessageConverter extends FastJsonHttpMessageConverter4 implements InitializingBean {

private RequestDecryptResponseEncryptBodyProcessor requestDecryptResponseEncryptBodyProcessor;

public void setRequestDecryptResponseEncryptBodyProcessor(RequestDecryptResponseEncryptBodyProcessor requestDecryptResponseEncryptBodyProcessor) {

this.requestDecryptResponseEncryptBodyProcessor = requestDecryptResponseEncryptBodyProcessor;

}

public RequestDecryptResponseEncryptBodyProcessor getRequestDecryptResponseEncryptBodyProcessor() {

return requestDecryptResponseEncryptBodyProcessor;

}

public DecryptEncryptFastJsonHttpMessageConverter() {

super();

}

@Override

public Object read(Type type, Class> contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {

InputStream in = inputMessage.getBody();

FastJsonConfig fastJsonConfig = getFastJsonConfig();

if (requestDecryptResponseEncryptBodyProcessor != null) {

String input = requestDecryptResponseEncryptBodyProcessor.decryptRequestBody(inputMessage, fastJsonConfig.getCharset());

byte[] bytes = input.getBytes(fastJsonConfig.getCharset());

return JSON.parseObject(bytes, 0, bytes.length, fastJsonConfig.getCharset(), type, fastJsonConfig.getFeatures());

}

return JSON.parseObject(in, fastJsonConfig.getCharset(), type, fastJsonConfig.getFeatures());

}

@Override

protected void writeInternal(Object obj, Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {

HttpHeaders headers = outputMessage.getHeaders();

ByteArrayOutputStream outnew = new ByteArrayOutputStream();

FastJsonConfig fastJsonConfig = getFastJsonConfig();

if (requestDecryptResponseEncryptBodyProcessor != null) {

String jsonString = JSON.toJSONString(obj,

fastJsonConfig.getSerializeConfig(),

fastJsonConfig.getSerializeFilters(),

fastJsonConfig.getDateFormat(),

JSON.DEFAULT_GENERATE_FEATURE, //

fastJsonConfig.getSerializerFeatures());

obj = requestDecryptResponseEncryptBodyProcessor.encryptResponseBody(jsonString, headers, fastJsonConfig.getCharset());

}

int len = JSON.writeJSONString(outnew, //

fastJsonConfig.getCharset(), //

obj, //

fastJsonConfig.getSerializeConfig(), //

fastJsonConfig.getSerializeFilters(), //

fastJsonConfig.getDateFormat(), //

JSON.DEFAULT_GENERATE_FEATURE, //

fastJsonConfig.getSerializerFeatures());

headers.setContentLength(len);

OutputStream out = outputMessage.getBody();

outnew.writeTo(out);

outnew.close();

}

@Override

protected Object readInternal(Class extends Object> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {

InputStream in = inputMessage.getBody();

FastJsonConfig fastJsonConfig = getFastJsonConfig();

if (requestDecryptResponseEncryptBodyProcessor != null) {

String input = requestDecryptResponseEncryptBodyProcessor.decryptRequestBody(inputMessage, fastJsonConfig.getCharset());

return JSON.parseObject(input.getBytes(fastJsonConfig.getCharset()), 0, input.length(), fastJsonConfig.getCharset(), clazz, fastJsonConfig.getFeatures());

}

return JSON.parseObject(in, fastJsonConfig.getCharset(), clazz, fastJsonConfig.getFeatures());

}

@Resource

private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

@Override

public void afterPropertiesSet() throws Exception {

// 重新排列處理方法,不然map會先處理,進而加密不了資料

List handlers = new ArrayList(requestMappingHandlerAdapter.getReturnValueHandlers());

int requestResponseBodyMethodProcessorIndex = 0;

int requestDecryptResponseEncryptBodyMethodProcessorIndex = 0;

RequestDecryptResponseEncryptBodyMethodProcessor requestDecryptResponseEncryptBodyMethodProcessor = null;

for (int i = 0, length = handlers.size(); i < length; i++) {

HandlerMethodReturnValueHandler handler = handlers.get(i);

if (handler instanceof RequestDecryptResponseEncryptBodyMethodProcessor) {

requestDecryptResponseEncryptBodyMethodProcessor = (RequestDecryptResponseEncryptBodyMethodProcessor) handler;

requestDecryptResponseEncryptBodyMethodProcessorIndex = i;

} else if (handler instanceof RequestResponseBodyMethodProcessor) {

requestResponseBodyMethodProcessorIndex = i;

}

}

if (requestDecryptResponseEncryptBodyMethodProcessor != null) {

handlers.remove(requestDecryptResponseEncryptBodyMethodProcessorIndex);

handlers.add(requestResponseBodyMethodProcessorIndex + 1, requestDecryptResponseEncryptBodyMethodProcessor);

}

requestMappingHandlerAdapter.setReturnValueHandlers(handlers);

//

List argumentResolvers = new ArrayList(requestMappingHandlerAdapter.getArgumentResolvers());

RequestDecryptResponseEncryptBodyMethodProcessor requestDecryptResponseEncryptBodyMethodProcessor2 = null;

for (int i = 0, length = argumentResolvers.size(); i < length; i++) {

HandlerMethodArgumentResolver argumentResolver = argumentResolvers.get(i);

if (argumentResolver instanceof RequestDecryptResponseEncryptBodyMethodProcessor) {

requestDecryptResponseEncryptBodyMethodProcessor2 = (RequestDecryptResponseEncryptBodyMethodProcessor) argumentResolver;

requestDecryptResponseEncryptBodyMethodProcessorIndex = i;

} else if (argumentResolver instanceof RequestResponseBodyMethodProcessor) {

requestResponseBodyMethodProcessorIndex = i;

}

}

if (requestDecryptResponseEncryptBodyMethodProcessor2 != null) {

argumentResolvers.remove(requestDecryptResponseEncryptBodyMethodProcessorIndex);

argumentResolvers.add(requestResponseBodyMethodProcessorIndex + 1, requestDecryptResponseEncryptBodyMethodProcessor2);

}

requestMappingHandlerAdapter.setArgumentResolvers(argumentResolvers);

}

}