package com.ffcs.itco.api.annotation;
import java.lang.annotation.*;
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface HeaderChecker {
/**
* Without default value means this argument is required
*
* @return Header names
*/
String[] headerNames();
}
标题二、编写注解要实现的逻辑
package com.ffcs.itco.api.aspect;
import com.ffcs.itco.api.annotation.HeaderChecker;
import com.ffcs.itco.api.util.DateUtil;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
import java.util.Optional;
@Aspect
@Component
public class HeaderCheckerAspect {
private final static Logger logger = LoggerFactory.getLogger(HeaderCheckerAspect.class);
@Before("@annotation(headerChecker)")
public void doBefore(HeaderChecker headerChecker) {
HttpServletRequest request = currentRequest();
if (Objects.isNull(request)) {
logger.info("without request, skip");
return;
}
String[] headerNames = headerChecker.headerNames();
for (String headerName : headerNames) {
String value = request.getHeader(headerName);
if (StringUtils.hasText(value)) {
continue;
}
logger.error("Header {} is required", headerName);
throw new IllegalArgumentException("Header " + headerName + " is required");
}
if(!request.getHeader("Content-Type").equals("application/json;charset=utf-8")){
logger.error("Header {} is required", "Content-Type");
throw new IllegalArgumentException("Header Content-Type is illegal ");
}
logger.info("checked");
}
@After("@annotation(headerChecker)")
public void doAfter(HeaderChecker headerChecker) {
HttpServletRequest request = currentRequest();
//set HttpServletResponse
HttpServletResponse response = currentResponse();
if("200".equals(response.getStatus())){
response.setHeader("Content-Type",request.getHeader("Content-Type"));
response.setHeader("X-Request-ID",request.getHeader("X-Request-ID"));
response.setHeader("Date", DateUtil.getUTCTimeStr());
}
logger.info("checked");
}
/**
* Return request current thread bound or null if none bound.
*
* @return Current request or null
*/
private HttpServletRequest currentRequest() {
// Use getRequestAttributes because of its return null if none bound
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
return Optional.ofNullable(servletRequestAttributes).map(ServletRequestAttributes::getRequest).orElse(null);
}
/**
* Return request current thread bound or null if none bound.
*
* @return Current request or null
*/
private HttpServletResponse currentResponse() {
// Use getRequestAttributes because of its return null if none bound
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
return Optional.ofNullable(servletRequestAttributes).map(ServletRequestAttributes::getResponse).orElse(null);
}
}