【问题标题】:Spring Interceptor弹簧拦截器
【发布时间】:2020-03-11 09:13:19
【问题描述】:

我需要创建一个拦截器来拦截 HTTP 请求和响应,但在我看来我做错了什么,有人可以告诉我应该更改或添加什么吗?

public class HttpInterceptor extends HandlerInterceptorAdapter implements ClientHttpRequestInterceptor
{
    @Override
    public ClientHttpResponse intercept(final HttpRequest httpRequest, final byte[] bytes, final ClientHttpRequestExecution clientHttpRequestExecution) throws IOException
    {

        RestTemplate restTemplate = new RestTemplate();
        final ClientHttpResponse response = clientHttpRequestExecution.execute(httpRequest, bytes);
        final String httpResponseName = response.toString();

        final HttpHeaders httpHeaders = response.getHeaders();
        final HttpStatus httpStatusCode = response.getStatusCode();
        final String statusText = response.getStatusText();

        final String body = httpHeaders.toString() + httpStatusCode.toString() + statusText;
        //And then i will put body to DB

        return response;
    }

xml

<bean id="httpInterceptor" class="HttpInterceptor"/>
<bean id="httpInterceptor" class="de.hybris.platform.servicelayer.interceptor.impl.InterceptorMapping">
    <property name="interceptor" ref="httpInterceptor"/>
    <property name="typeCode" value="Message"/>
</bean>

【问题讨论】:

  • 目前尚不清楚您要在这里实现什么。 RestTemplate 和 ClientHttpRequestInterceptor 是关于将您的代码作为客户端的出站请求。 ServiceLayer 拦截器(参见 XML)是关于处理请求(或其他工作)时的内部 Hybris 操作。您是否尝试在此处捕获入站请求详细信息,外部系统调用 Hybris 的位置?

标签: spring spring-mvc resttemplate interceptor intercept


【解决方案1】:

我了解到您尝试创建服务(可以是休息、肥皂或任何其他)。如果我是对的,您需要创建控制器来处理 http 请求。

@Controller("MyController")
public class MyController extends AbstractController {
    @RequestMapping(value = "/mymethod/{id}", method = RequestMethod.GET)
    public void myMethod(@PathVariable final String id, final HttpServletRequest request, final HttpServletResponse out) throws Exception {
    try {
        if (StringUtils.isEmpty(id))
            throw new UnknownIdentifierException("id is null!");
        out.setContentType(MediaType.APPLICATION_TXT_VALUE);
        IOUtils.copy(myStream, out.getOutputStream());
    } catch (UnknownIdentifierException ex) {
        out.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        out.setContentType(MediaType.TEXT_PLAIN_VALUE);
        String message = "My error text!";
        IOUtils.copy(new ByteArrayInputStream(message.getBytes()), out.getOutputStream());
    } 
}

【讨论】:

    【解决方案2】:

    我建议实现过滤器来转换或使用请求或响应中包含的信息。而不是 Interceptor ,它比 Interceptor 提供更多信息 这是使用过滤器进行日志记录的示例:

    @Component
    public class HttpLoggingFilter implements Filter {
    
        private static final Logger logger = LoggerFactory.getLogger(HttpLoggingFilter.class);
    
        @Value("${output.trace.actif}")
        private boolean isOutputActif;
    
        private static String getRequestData(final HttpServletRequest request) throws UnsupportedEncodingException {
    
            String payload = null;
            ContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, ContentCachingRequestWrapper.class);
            if (wrapper != null) {
                byte[] buf = wrapper.getContentAsByteArray();
                if (buf.length > 0) {
                    payload = new String(buf, 0, buf.length, wrapper.getCharacterEncoding());
                }
            }
            return payload;
        }
    
        private static String getResponseData(final HttpServletResponse response) throws IOException {
    
            String payload = null;
            ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class);
            if (wrapper != null) {
                byte[] buf = wrapper.getContentAsByteArray();
                if (buf.length > 0) {
                    payload = new String(buf, 0, buf.length, wrapper.getCharacterEncoding());
                    wrapper.copyBodyToResponse();
                }
            }
            return payload;
        }
    
        @Override
        public void init(FilterConfig filterConfig) {
            logger.info("start http filter");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    
            ContentCachingRequestWrapper requestToCache = new ContentCachingRequestWrapper(httpServletRequest);
            ContentCachingResponseWrapper responseToCache = new ContentCachingResponseWrapper(httpServletResponse);
    
            HttpUtil.majMDCRestInfo(httpServletRequest);
    
            long start = System.currentTimeMillis();
    
            chain.doFilter(requestToCache, responseToCache);
    
            long elapsedTime = System.currentTimeMillis() - start;
    
            String requestBody = new String(requestToCache.getContentAsByteArray());
            String responseBody = new String(responseToCache.getContentAsByteArray());
    
            final StringBuilder logMessage = new StringBuilder().append("[METHOD:").append(httpServletRequest.getMethod())
                    .append("] [PARAMS:")
                    .append(httpServletRequest.getQueryString()).append("] [BODY:").append(requestBody).append("]");
    
            if (isOutputActif) {
                String respContent = responseBody;
                if (respContent.equals("")) {
                    respContent = "no data";
                }
                logMessage.append(" [RESPONSE:").append(respContent).append("]");
            }
    
            logMessage.append(" [STATUS:").append(responseToCache.getStatus()).append("] [Time:").append(elapsedTime).append("ms]");
            String[] nonLoggingPaths = {"/api/"};
            String urlPath = httpServletRequest.getRequestURL().toString();
            if ((Arrays.stream(nonLoggingPaths).parallel().anyMatch(urlPath::contains))) {
                logger.info("{}", logMessage);
            }
    
            getRequestData(requestToCache);
            getResponseData(responseToCache);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2020-03-26
      • 1970-01-01
      • 2011-06-28
      • 2020-10-01
      相关资源
      最近更新 更多