目录
一、HttpServletRequestWrapper代码
二、HttpServletRequestWrapper代码
三、加解密过滤器代码
四、国际化过滤器代码
一、HttpServletRequestWrapper代码
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @author
* @description: 请求装饰器
* @date 2023-12-18 11:09:46
*/
public class RequestWrapper extends HttpServletRequestWrapper {
private byte[] bytes;
private HttpServletRequest request;
/**
* @param request
*/
public RequestWrapper(HttpServletRequest request) {
super(request);
= request;
}
public String getRequestBody() throws IOException {
try (BufferedInputStream bis = new BufferedInputStream(());
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
byte[] buffer = new byte[1024];
int len;
while ((len = (buffer)) > 0) {
(buffer, 0, len);
}
bytes = ();
String body = new String(bytes);
return body;
} catch (IOException ex) {
throw ex;
}
}
public void setRequestBody(String body){
bytes = ();
}
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return ();
}
};
}
}
二、HttpServletRequestWrapper代码
package ;
import ;
import ;
import ;
import ;
import .*;
/**
* @author
* @description: 响应装饰器
* @date 2023-12-15 13:29:16
*/
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream outputStream;
public byte[] getResponseData(){
try {
();
} catch (IOException e) {
();
}
return ();
}
public ResponseWrapper(HttpServletResponse response) {
super(response);
=new ByteArrayOutputStream();
}
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(outputStream);
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new ServletOutputStream() {
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener listener) {
}
@Override
public void write(int b) throws IOException {
(b);
}
};
}
}
三、加解密过滤器代码
package ;
import .;
import .;
import .*;
import ;
import ;
import ;
import ;
import ;
import .*;
import ;
import ;
import .slf4j.Slf4j;
import .;
import ;
import ;
import ;
import ;
import ;
/**
* @author
* @description: 加解码过滤器
* @date 2023-12-15 16:46:03
*/
@Slf4j
public class CodecFilter implements Filter {
@Resource
protected CodecProperties codecProperties;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 请求解密
if (() && !isIgnore() && ("POST".equals(((HttpServletRequest)request).getMethod().trim().toUpperCase())) && "application/json".equals(().trim().toLowerCase())){
RequestWrapper requestWrapper = new RequestWrapper((HttpServletRequest) request);
String bodyStr = ();
if((bodyStr)){
JSONObject bodyJson = (bodyStr);
Object data = ("data");
if(data != null && data instanceof String && ((String)data).trim().length () !=0 ){
if (()) {
("解密 API 请求消息:type={}, requestBody={}",(), ());
}
String plainText = ((String) data, ,(),(),());
("data",(plainText));
(());
}
}
// 包装响应对象
ResponseWrapper responseWrapper = new ResponseWrapper((HttpServletResponse) response);
(requestWrapper, responseWrapper);
// 拿到响应对象
byte[] responseData = ();
if("application/json".equals(().trim().toLowerCase())){
String originalResulet = new String(responseData);
JSONObject jsonObject =(originalResulet);
// 拿到响应对象中的data
Object data = ("data");
if(data != null){
String encText = ((data), ,(),(),());
("data", encText);
}
responseData = ().getBytes("utf-8");
}
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
();
().write(responseData);
().flush();
}else{
// 处理业务逻辑
(request, response);
}
}
@Override
public void destroy() {
}
protected boolean isIgnore() {
boolean isIgnore = false;
String[] ignoreUrl = ();
if ((ignoreUrl)) {
HttpServletRequest request =
((ServletRequestAttributes) (
())).getRequest();
for (String s : ignoreUrl) {
if ((s, ())) {
isIgnore = true;
break;
}
}
}
return isIgnore;
}
}
四、国际化过滤器代码
package ;
import .;
import ;
import ;
import .I18NUtils;
import ;
import ;
import ;
import .*;
import ;
import ;
import ;
import .slf4j.Slf4j;
import .;
import org.;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @author
* @description:
* @date 2023-12-15 16:46:03
*/
@Slf4j
public class I18NFilter implements Filter {
@Value("${uap.:false}")
private boolean i18nEnable;
@Value("${uap.:zh_CN}")
private String language;
@Value("${uap.-url:/,/webjars/**,/v3/api-docs/**,/actuator**,/}")
private String ignoreUrl;
@Value("${-request-id:false}")
private boolean msgIncludeRequestId;
public I18NFilter() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 如果开启了国际化则进行国际化处理
if (i18nEnable && !isIgnore()) {
// 包装响应对象
ResponseWrapper customResponseWrapper = new ResponseWrapper((HttpServletResponse) response);
// 处理业务逻辑
(request, customResponseWrapper);
// 拿到响应对象
byte[] responseData = ();
if("application/json".equals(().trim().toLowerCase())){
String originalResulet = new String(responseData);
JSONObject jsonObject =(originalResulet);
// 拿到响应对象中的msg
String msg = (String)("msg");
String i18nMsg = null;
if ( (msg) ) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String languageInheader = ("Language");
// 优先使用请求头里的国际化语言
if (languageInheader != null) {
i18nMsg = I18NUtils.getI18N(msg, languageInheader);
} else {
i18nMsg = I18NUtils.getI18N(msg, language);
}
}else if( (msg) ){// 不进行国际化也要清除相关缓存
().remove(msg++().getId());
().remove(msg++().getId());
}
if(i18nMsg != null ){
msg = i18nMsg;
}
if(msg == null){
msg = "";
}
// 如果线程号不存在,则进行设置
if((("UUID"))){
("UUID", ());
}
// msg中携带请求id返回
if(msgIncludeRequestId ){
msg = ("UUID") + + msg ;
}
("msg", msg);
responseData = ().getBytes("utf-8");
}
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
();
().write(responseData);
().flush();
}else{
// 处理业务逻辑
(request, response);
}
}
@Override
public void destroy() {
}
protected boolean isIgnore() {
boolean isIgnore = false;
if((ignoreUrl)){
return false;
}
String[] ignoreUrls = ();
if ((ignoreUrls)) {
HttpServletRequest request =
((ServletRequestAttributes) (
())).getRequest();
for (String s : ignoreUrls) {
if ((s, ())) {
isIgnore = true;
break;
}
}
}
return isIgnore;
}
}
五、过滤器注册
/**
* 国际化过滤器
* @return
*/
@Bean
public I18NFilter i18NFilter() {
return new I18NFilter();
}
@Bean
public FilterRegistrationBean i18NFilterRegistrationBean() {
// 新建过滤器注册类
FilterRegistrationBean registration = new FilterRegistrationBean();
// 添加自定义 过滤器
(i18NFilter());
// 设置过滤器的URL模式
("/*");
//设置过滤器顺序
(4);
return registration;
}
/**
* 请求加解密过滤器
* @return
*/
@Bean
public CodecFilter codecFilter() {
return new CodecFilter();
}
@Bean
public FilterRegistrationBean codecFilterRegistrationBean() {
// 新建过滤器注册类
FilterRegistrationBean registration = new FilterRegistrationBean();
// 添加自定义 过滤器
(codecFilter());
// 设置过滤器的URL模式
("/*");
//设置过滤器顺序
(3);
return registration;
}
本人近十年JAVA架构设计经验,长期从事IT技术资源整合。有志于自我技术提升、需要最新IT技术课程的小伙伴,可私信联系我 ,粉丝一律友情价