利用注解进行文件导出
package com.nuonuo.tax.enterprise.web.aspect;
import com.alibaba.fastjson.JSONObject;
import com.nuonuo.tax.enterprise.common.utils.StringUtil;
import com.nuonuo.tax.enterprise.thread.RequireParameterHolder;
import com.nuonuo.tax.enterprise.web.annotation.Export;
import com.nuonuo.tax.enterprise.web.filter.SignFilter;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* AOP 截取加了@Export 自定义注解的方法, 设置respones属性
*/
@Aspect
@Slf4j
@Component
public class ExportAspect {
private static final String REQUIRED_FIELD = "fileName";
@Autowired
private Set<FilterRegistrationBean> filterRegistrationBeans;
@Pointcut("@annotation(com.nuonuo.tax.enterprise.web.annotation.Export)")
public void exportAspectPointCut() {
}
@Around("exportAspectPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
HttpServletRequest request;
HttpServletResponse response;
String fileName = null;
Export annotation = method.getAnnotation(Export.class);
if (Objects.nonNull(annotation)) {
request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
// ThreadLocal缓存获取 请求参数
String requiredParameters = RequireParameterHolder.get();
if (StringUtil.isNotEmpty(requiredParameters)) {
if (requiredParameters.startsWith("{")) {
JSONObject requiredParametersJsonObject = JSONObject.parseObject(
requiredParameters);
if (requiredParametersJsonObject.containsKey(REQUIRED_FIELD)) {
fileName = requiredParametersJsonObject.getString(REQUIRED_FIELD);
}
} else {
for (FilterRegistrationBean filterRegistrationBean : filterRegistrationBeans) {
if (filterRegistrationBean.getFilter() instanceof SignFilter) {
Map requiredParametersMap = ((SignFilter) filterRegistrationBean.getFilter()).objectGetToMap(
requiredParameters);
if (requiredParametersMap.containsKey(REQUIRED_FIELD)) {
fileName = (String) requiredParametersMap.get(REQUIRED_FIELD);
}
}
}
}
}
if (StringUtil.isEmpty(fileName)) {
fileName = annotation.defaultFileName();
}
response.setContentType("application/octet-stream");
switch (annotation.type()) {
case "excel":
response.setHeader("content-type", "application/vnd.ms-excel");
fileName += ".xls";
break;
case "pdf":
response.setHeader("content-type", "application/pdf");
fileName += ".pdf";
break;
case "zip":
response.setHeader("content-type", "application/x-zip-compressed");
fileName += ".zip";
break;
case "txt":
response.setHeader("content-type", " text/plain");
fileName += ".txt";
break;
default:
break;
}
fileName = URLEncoder.encode(fileName, "UTF-8");
switch (annotation.openType()) {
case "attachment":
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
break;
case "inline":
response.setHeader("Content-Disposition", "inline; filename=" + fileName);
break;
default:
break;
}
}
return point.proceed();
}
}