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("-----------------------\n");
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("\n");
//方法名称
sb.append("Method: ").append(h.getMethod().getName()).append("\n");
//请求方式post\put\get 等等
sb.append("RequestMethod: ").append(request.getMethod()).append("\n");
//所有的请求参数
sb.append("Params: ").append(parmeter).append("\n");
//部分请求链接
sb.append("URI : ").append(request.getRequestURI()).append("\n");
//完整的请求链接
sb.append("AllURI: ").append(reqURL).append("\n");
//请求方的 ip地址
sb.append("request IP: ").append(ip).append("\n");
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);
}
}
}
} }
}

  

拦截器(Inteceptor),过滤器(Filter),切面(Aspect)处理HttpServiceReqeust请求的更多相关文章

  1. Spring Boot实战:拦截器与过滤器

    一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...

  2. struct_2拦截器与过滤器

    这个为网上所剪切的知识点,仅为个人学习所用,无其他用途. 过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者 ...

  3. java 拦截器、过滤器、监听器

    一.理解Struts2拦截器 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...

  4. Spring Boot之拦截器与过滤器(完整版)

    作者:liuxiaopeng 链接:http://www.cnblogs.com/paddix 作者:蓝精灵lx原文:https://blog.csdn.net/liuxiao723846/artic ...

  5. Spring Aop、拦截器、过滤器的区别

    Filter过滤器:拦截web访问url地址.Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问.Spring AOP拦截器:只能拦截Spring管理Bean的访 ...

  6. SpringMVC——拦截器,过滤器实现登录拦截

    一.拦截器与过滤器的区别 1.过滤器 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操 ...

  7. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  8. struts2拦截器与过滤器

    转载:http://www.cnblogs.com/JohnLiang/archive/2011/12/15/2288376.html 过滤器,是在java web中,你传入的request,resp ...

  9. SpringMVC中的拦截器、过滤器的区别、处理异常

    1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...

随机推荐

  1. VBA验证工作表是否存在

    使用VBA验证工作表是否存在 ============================================================= 代码区域 ================== ...

  2. Linxu 监控命令总结

    free –m [root@web1476 ~]# free        total       used       free     shared    buffers     cached M ...

  3. maven 动态版本 aliyun阿里云Maven仓库地址——加速你的maven构建

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. Mac下忘记了phpAdmin设置的MySQL密码

    事情是这样的,我昨天配置完MySQL和PHP环境后,又配置了phpAdmin. 这本来是件好事,结果我看到phpAdmin提醒我说我的MySQL的Root帐号密码是空密码,于是我修改了下密码. 由于p ...

  5. git问题:git提交的时候总是提示key加载失败,总是需要手工将key加到Pageant中

    问题描述: 重装过一次系统,在重装之前git+tortoisegit配合很好,提交的时候都能自动加载ppk,但是重装系统后,也重新生成pulic key上传到了服务器,但是每次提交的时候都提示key加 ...

  6. Java并发编程(七):线程安全策略

    Java多线程——不可变对象 Java多线程——线程封闭 java线程不安全类与写法 Java线程安全同步容器 Java里的并发容器与安全共享策略总结

  7. Bash中的括号(三)

    1.两个小括号用来对整数进行算术运算和逻辑运算,比如. 例如给变量赋值: $ a=+; echo $a + $ (( b = + )); echo $b 1+1 只是一个字符串,而 b 就是一个算术表 ...

  8. linux下批量替换文件内容(转)

    http://www.cnblogs.com/end/archive/2012/05/24/2517131.html 1.网络上现成的资料 格式: sed -i "s/查找字段/替换字段/g ...

  9. ajax请求的data数据格式

    ajax提交data类型 一.问题来源 今天使用ajax时,发现get传data时,传递json字符串时传不过去参数,所以做了一些实验测试ajax的get和post的传递data时的不同. 二.概念 ...

  10. ECC加密算法原理入门介绍

    前言 同RSA(Ron Rivest,Adi Shamir,Len Adleman三位天才的名字)一样,ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)也属于公开 ...