• 拦截器(Inteceptor),过滤器(Filter),切面(Aspect)处理HttpServiceReqeust请求


    1.拦截器

    java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

    package com.shitou.deposit.interceptor;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.lang.reflect.Parameter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.core.MethodParameter;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.shitou.deposit.contract.dto.req.Request;
    
    /**
     * DepositInterceptor
     * @author zhouky
     * @since 2018年12月27日
     */
    public class DepositInterceptor implements HandlerInterceptor {
    	private Logger logger = LoggerFactory.getLogger(getClass());
    	
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    		logger.info("DepositInterceptor ...");
    		
    		// 所有请求第一个进入的方法
    		String reqURL = request.getRequestURL().toString();
    		String ip = request.getRemoteHost ();
    		InputStream is = request.getInputStream ();
    		StringBuilder responseStrBuilder = new StringBuilder ();
    		BufferedReader streamReader = new BufferedReader (new InputStreamReader (is,"UTF-8"));
    		String inputStr;
    		while ((inputStr = streamReader.readLine()) != null) responseStrBuilder.append(inputStr);
    		String parmeter = responseStrBuilder.toString();
    		long startTime = System.currentTimeMillis();
    		request.setAttribute("startTime", startTime);
    		if (handler instanceof HandlerMethod) {
    			StringBuilder sb = new StringBuilder(1000);
    			sb.append("-----------------------
    ");
    			HandlerMethod h = (HandlerMethod) handler;
    			Parameter[] objs =h.getMethod().getParameters();
    			for(Object obj:objs){
    				Request req = (Request) obj;
    				System.out.println("");
    				if(obj instanceof Request){
    				}
    			}
    			
    			//Controller 的包名
    			sb.append("Controller: ").append(h.getBean().getClass().getName()).append("
    ");
    			//方法名称
    			sb.append("Method: ").append(h.getMethod().getName()).append("
    ");
    			//请求方式postputget 等等
    			sb.append("RequestMethod: ").append(request.getMethod()).append("
    ");
    			//所有的请求参数
    			sb.append("Params: ").append(parmeter).append("
    ");
    			//部分请求链接
    			sb.append("URI : ").append(request.getRequestURI()).append("
    ");
    			//完整的请求链接
    			sb.append("AllURI: ").append(reqURL).append("
    ");
    			//请求方的 ip地址
    			sb.append("request IP: ").append(ip).append("
    ");
    			logger.info(sb.toString());
    		}
    		//修改request中的参数并保存到request中 
    		request.setAttribute("parmeter_json", parmeter);
    		
    		return true;
    	}
    	
    	@Override
    	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}
    	
    	@Override
    	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
    	
    }
    

      

    package com.shitou.deposit.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    import com.shitou.deposit.interceptor.DepositInterceptor;
    import com.shitou.deposit.interceptor.DepositInterceptor1;
    
    /**
     * InterceptorConfig
     * @author zhouky
     * @since 2018年12月27日
     */
    @Configuration
    public class InterceptorConfig extends WebMvcConfigurerAdapter {
    
        @Bean
        public DepositInterceptor getDepositInterceptor() {
            return new DepositInterceptor();
        }
        
        @Bean
        public DepositInterceptor1 getDepositInterceptor1() {
            return new DepositInterceptor1();
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
        	registry.addInterceptor(getDepositInterceptor()).addPathPatterns("/deposit/**");
    //    	registry.addInterceptor(getDepositInterceptor1()).addPathPatterns("/deposit/**");
            super.addInterceptors(registry);
        }
        
    }
    

      

    package com.shitou.deposit.interceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.alibaba.fastjson.JSONObject;
    import com.shitou.deposit.filter.BufferedServletRequestWrapper;
    
    /**
     * DepositInterceptor1
     * @author zhouky
     * @since 2018年12月27日
     */
    public class DepositInterceptor1 implements HandlerInterceptor {
    	private Logger logger = LoggerFactory.getLogger(getClass());
    	
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    		logger.info("DepositInterceptor begin ...");
    		
    		BufferedServletRequestWrapper requestWrapper = new BufferedServletRequestWrapper(request);
    	    //在这边替换流,使用工具类GetRequestJsonUtils获取json参数
    		JSONObject json = GetRequestJsonUtils.getRequestJsonObject(requestWrapper);
    		
    		logger.info("DepositInterceptor end ...{}",json.toJSONString());
    		return true;
    	}
    	
    	@Override
    	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}
    	
    	@Override
    	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
    	
    }
    

      

    package com.shitou.deposit.filter;
    
    import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    
    /**
     * BufferedServletRequestWrapper
     * @author zhouky
     * @since 2018年12月27日
     */
    public class BufferedServletRequestWrapper extends HttpServletRequestWrapper {
     
    	private byte[] buffer;
     
    	public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {
    		super(request);
    		InputStream is = request.getInputStream();
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
    		byte buff[] = new byte[1024];
    		int read;
    		while ((read = is.read(buff)) > 0) {
    			baos.write(buff, 0, read);
    		}
    		this.buffer = baos.toByteArray();
    	}
     
    	@Override
    	public ServletInputStream getInputStream() throws IOException {
    		return new BufferedServletInputStream(this.buffer);
    	}
     
    	// 对外提供读取流的方法
    	@Override
    	public BufferedReader getReader() throws IOException {
    		return new BufferedReader(new InputStreamReader(getInputStream()));
    	}
    }
    

      

    package com.shitou.deposit.interceptor;
    
    import java.io.IOException;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.commons.lang3.StringUtils;
    
    import com.alibaba.fastjson.JSONObject;
    
    /**
     * GetRequestJsonUtils
     * @author zhouky
     * @since 2018年12月27日
     */
    public class GetRequestJsonUtils {
    	
    	public static JSONObject getRequestJsonObject(HttpServletRequest request) throws IOException {
    		String json = getRequestJsonString(request);
    		return JSONObject.parseObject(json);
    	}
    	
    	 /***
         * 获取 request 中 json 字符串的内容
         * 
         * @param request
         * @return : <code>byte[]</code>
         * @throws IOException
         */
        public static String getRequestJsonString(HttpServletRequest request)
                throws IOException {
            String submitMehtod = request.getMethod();
            // GET
            if (submitMehtod.equals("GET")) {
            	if(StringUtils.isNotEmpty(request.getQueryString())){
            		return new String(request.getQueryString().getBytes("iso-8859-1"),"utf-8").replaceAll("%22", """);
            	}else{
            		return new String("".getBytes("iso-8859-1"), "utf-8").replaceAll("%22", """);
            	}
            // POST
            } else {
                return getRequestPostStr(request);
            }
        }
     
        /**      
         * 描述:获取 post 请求的 byte[] 数组
         * <pre>
         * 举例:
         * </pre>
         * @param request
         * @return
         * @throws IOException      
         */
        public static byte[] getRequestPostBytes(HttpServletRequest request)
                throws IOException {
            int contentLength = request.getContentLength();
            if(contentLength<0){
                return null;
            }
            byte buffer[] = new byte[contentLength];
            for (int i = 0; i < contentLength;) {
     
                int readlen = request.getInputStream().read(buffer, i,
                        contentLength - i);
                if (readlen == -1) {
                    break;
                }
                i += readlen;
            }
            return buffer;
        }
     
        /**      
         * 描述:获取 post 请求内容
         * <pre>
         * 举例:
         * </pre>
         * @param request
         * @return
         * @throws IOException      
         */
        public static String getRequestPostStr(HttpServletRequest request)
                throws IOException {
            byte buffer[] = getRequestPostBytes(request);
            String charEncoding = request.getCharacterEncoding();
            if (charEncoding == null) {
                charEncoding = "UTF-8";
            }
            return new String(buffer, charEncoding);
        }
    }
    

      2.过滤器

    package com.shitou.deposit.filter;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Component;
    
    /**
     * DepositFilter
     * @author zhouky
     * @since 2018年12月27日
     */
    @Component
    @WebFilter(filterName="DepositFilter",urlPatterns="/**")
    public class DepositFilter implements Filter{
     
    	/**
    	 * 过滤
    	 */
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		ServletRequest requestWrapepr = null;
    		if(request instanceof HttpServletRequest){
    			requestWrapepr = new BufferedServletRequestWrapper((HttpServletRequest)request);
    		}
    		if(requestWrapepr == null){
    			chain.doFilter(request, response);
    		}else{
    			chain.doFilter(requestWrapepr, response);
    		}
    	}
     
    	/**
    	 * 初始化
    	 */
    	@Override
    	public void init(FilterConfig arg0) throws ServletException {}
    	
    	/**
    	 * 销毁
    	 */
    	@Override
    	public void destroy() {}
     
    }
    

      

    package com.shitou.deposit.filter;
    
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    
    import javax.servlet.ReadListener;
    import javax.servlet.ServletInputStream;
    
    class BufferedServletInputStream extends ServletInputStream {
        private ByteArrayInputStream inputStream;
        public BufferedServletInputStream(byte[] buffer) {
            this.inputStream = new ByteArrayInputStream( buffer );
        }
        @Override
        public int available() throws IOException {
            return inputStream.available();
        }
        @Override
        public int read() throws IOException {
            return inputStream.read();
        }
        @Override
        public int read(byte[] b, int off, int len) throws IOException {
            return inputStream.read( b, off, len );
        }
    	@Override
    	public boolean isFinished() {
    		return false;
    	}
    	@Override
    	public boolean isReady() {
    		return false;
    	}
    	@Override
    	public void setReadListener(ReadListener listener) {}
    }
    

      

    package com.shitou.deposit.filter;
    
    import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    
    /**
     * BufferedServletRequestWrapper
     * @author zhouky
     * @since 2018年12月27日
     */
    public class BufferedServletRequestWrapper extends HttpServletRequestWrapper {
     
    	private byte[] buffer;
     
    	public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {
    		super(request);
    		InputStream is = request.getInputStream();
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
    		byte buff[] = new byte[1024];
    		int read;
    		while ((read = is.read(buff)) > 0) {
    			baos.write(buff, 0, read);
    		}
    		this.buffer = baos.toByteArray();
    	}
     
    	@Override
    	public ServletInputStream getInputStream() throws IOException {
    		return new BufferedServletInputStream(this.buffer);
    	}
     
    	// 对外提供读取流的方法
    	@Override
    	public BufferedReader getReader() throws IOException {
    		return new BufferedReader(new InputStreamReader(getInputStream()));
    	}
    }
    

      

    package com.shitou.deposit.filter;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    import com.alibaba.fastjson.JSONObject;
    
    //@Component
    //@WebFilter(filterName = "DepositFilter1", urlPatterns = "/*")
    public class DepositFilter1 implements Filter {
    
    	@SuppressWarnings("unused")
    	private Logger logger = LoggerFactory.getLogger(DepositFilter1.class);
    
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {}
    
    	@Override
    	public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
    			throws IOException, ServletException {
    		HttpServletRequest request = (HttpServletRequest) srequest;
    		// 访问地址
    		String uri = request.getRequestURI();
    		if ("/deposit/execute".equals(uri)) {
    			Map<String,Object> m = new HashMap<String, Object>(request.getParameterMap());
    			logger.info(JSONObject.toJSONString(m));
    			HttpServletRequest req = (HttpServletRequest) request;
    			ParameterRequestWrapper wrapRequest = new ParameterRequestWrapper(req, m);
    			logger.info(JSONObject.toJSONString(wrapRequest.getParameterMap()));
    			request = wrapRequest;
    		}
    		filterChain.doFilter(request, sresponse);
    	}
    
    	@Override
    	public void destroy() {}
    
    }
    

      3.切面

    package com.shitou.deposit.aspect;
    
    import java.util.Base64;
    import java.util.Map;
    
    import org.apache.commons.lang3.StringUtils;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    import com.shitou.deposit.baofu.config.BaoFuConfig;
    import com.shitou.deposit.contract.dto.req.Request;
    import com.shitou.deposit.lanmaoly.config.LanMaolyConfig;
    import com.shitou.deposit.strategy.enums.TransactionChannelEnum;
    import com.shitou.framework.log.LOG_TYPE;
    
    @SuppressWarnings("unchecked")
    //@Component
    //@Aspect
    public class DepositAspect {
        private final Logger logger = LoggerFactory.getLogger(LOG_TYPE.CONTROLLER_ASPECT.val);
    
        @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
        public void depositAspect() {}
    
        @Before(value = "depositAspect()")
        public void beforeAdvice(JoinPoint pjp) throws Throwable {
            Object[] objects = pjp.getArgs();
            for(Object obj:objects){
            	if(obj instanceof Request){
            		Request paramVO = (Request) obj;
            		
    				Map<String,Object> reqMap = (Map<String, Object>) paramVO.getReqData();
            		boolean bool = reqMap.containsKey("retUrl");
            		if(bool){
            			String retUrl = (String) reqMap.get("retUrl");
            			if(StringUtils.isNotBlank(retUrl)){
            				String encodedUrl = Base64.getEncoder().encodeToString(retUrl.getBytes());
            				if(TransactionChannelEnum.LANM.getCode().equals("")&&
            						!"1".equals(LanMaolyConfig.ifSyncDirectSwitch)){// 懒猫是否开启同步回盘直连前端开关 1-是 0-否
            					retUrl = LanMaolyConfig.syncLM+"/"+encodedUrl;
            				}else if(TransactionChannelEnum.BAOF.getCode().equals("")&&
            						!"1".equals(BaoFuConfig.ifSyncDirectSwitch)){
            					retUrl = BaoFuConfig.syncBF+"/"+encodedUrl;
            				}
            				reqMap.put("retUrl", retUrl);
            				paramVO.setReqData(reqMap);
            			}
            		}
            	}
            }
    
        }
    }
    

      

  • 相关阅读:
    Es学习第六课, ES基本搜索_search
    Es学习第一课,了解基本功能和概念
    Es学习第二课, ES安装和客户端使用
    Es学习第四课, 倒排索引
    nginx的location配置详解
    Es学习第三课, ElasticSearch基本的增删改查
    Es学习第五课, 分词器介绍和中文分词器配置
    关于Spring的一点理解
    好久没来,回来了。
    对于ie不支持select的option的onclick事件的处理
  • 原文地址:https://www.cnblogs.com/therunningfish/p/10189366.html
Copyright © 2020-2023  润新知