zoukankan      html  css  js  c++  java
  • 在controller处理完请求之后返回页面渲染之前拦截返回值

    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.MethodParameter;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.server.ServerHttpRequest;
    import org.springframework.http.server.ServerHttpResponse;
    import org.springframework.http.server.ServletServerHttpRequest;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    
    import com.loan.basedao.IRedisUtil;
    import com.loan.basedao.impl.RedisUtilImpl;
    import com.loan.common.CommUtil;
    import com.loan.kafka.impl.SendMsgServerImpl;
    import com.loan.mongo.entity.SysLog;
    import net.sf.json.JSONObject;
    /**
     * 用于修改resonse返回的数据和发送mq因为在拦截器里面发送了请求开始的kafaka,然后在处理完请求之后也会发送kafka这样一来便于统计访问接口的日志和请求的时间
     * @author Administrator
     *
     */
    @ControllerAdvice
    public class ResponseController implements ResponseBodyAdvice<Object>{
        @Autowired
        private SendMsgServerImpl sendMsgServer;
        @Resource(type = RedisUtilImpl.class)
        private IRedisUtil redisParent;
        
        @Override
        public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
            return true;
        }
        /**
         * 此方法是拦截返回值,并且操作返回值
         * @param body
         * @param returnType
         * @param selectedContentType
         * @param selectedConverterType
         * @param request
         * @param response
         * @return
         */
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
                ServerHttpResponse response) {
            System.out.println("进入操作返回方法");
            ServletServerHttpRequest request3 = (ServletServerHttpRequest)request;
            HttpServletRequest request4 = request3.getServletRequest();
            //uuid
            String uuid = CommUtil.toString(request4.getHeader("uuid"));
            //获取responsebody参数
            JSONObject json = JSONObject.fromObject(body);
            String responses =json.toString();
            //结束时间
            long endTime=System.currentTimeMillis();
            //开始时间
            long beginTime=0;
            if(redisParent.containsKey(uuid+"INTERCEPTOR_TIME")){
                beginTime =(long)redisParent.get(uuid+"INTERCEPTOR_TIME");
                //耗时
                //发送kafka日志
                SysLog sysLog = new SysLog();
                sysLog.setUuid(uuid);//uuid
                sysLog.setType("3");//类型
                sysLog.setLogBegTime(CommUtil.stampToDate(String.valueOf(beginTime)));//开始时间
                sysLog.setLogEndTime(CommUtil.stampToDate(String.valueOf(endTime)));//结束时间
                sysLog.setUseTime(String.valueOf(endTime-beginTime));//耗时
                sysLog.setResponse(responses);//返回数据
                sendMsgServer.sendMsg("sysLogTopic", sysLog);
                System.out.println("===================================控制器返回发送消息成功");
                redisParent.remove(uuid+"INTERCEPTOR_TIME");
            }
            
            return body;
        }
    }
  • 相关阅读:
    验证视图状态 MAC 失败的处理办法总结![come from internet]
    在ie6上 让他显示png图片
    挑灯夜战 css hack 再次学习 IE浏览器常见的9个css Bug以及解决办法
    fileupload上传 and IE8 and VS2008 实现图片预览[new Name:经典的Fakepath错误]
    大项目开发语言的选择
    虚拟机安装linux:未找到任何驱动程序
    objectc中的bool
    关于数字内容网站的一些想法
    iphone开发论坛
    在centos5.3下安装mysql5启动时报错
  • 原文地址:https://www.cnblogs.com/oushiyang/p/9760916.html
Copyright © 2011-2022 走看看