精华内容
下载资源
问答
  • 利用Spring的AOP拦截post方法
    2020-11-24 23:01:57
    • @Component 依赖注入
    • @Order(1)

    注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响;

    • @Asoect

    @Aspect:作用是把当前类标识为一个切面供容器读取
    @Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。
    @Around:环绕增强,相当于MethodInterceptor
    @AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行
    @Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有
    @AfterThrowing:异常抛出增强,相当于ThrowsAdvice
    @After: final增强,不管是抛出异常或者正常退出都会执行

    @Component
    @Order(1)
    @Aspect
    public class RequestAop {
        private static final Logger logger = LoggerFactory.getLogger("RequestAop");
    
        @Around("execution(* com.alibaba.industryadminportal.web..*.*(..)) " +
                "&& !execution(* com.alibaba.industryadminportal.web.JsonpResponseBodyAdvice.*(..))" +
                "&& !execution(* com.alibaba.industryadminportal.web.epc.AdapterAuthManagerController.getOemBrand(..))" +
                "&& !execution(* com.alibaba.industryadminportal.web.epc.AdapterAuthManagerController.getItemSkuAdapter(..))" +
                "&& !execution(* com.alibaba.industryadminportal.web.epc.AdapterAuthManagerController.getItemSkuExt(..))")
        public Object doAroundMethod(ProceedingJoinPoint pig) throws Throwable {
            Object obj = null;
            try {
                if (!judgeIsGet()) {
                    logger.info("aop post is not allow");
                    return getResult(pig, obj);
                }
                obj = pig.proceed();
            } catch (Throwable e) {
                logger.error("aop is Exception " + ExceptionUtils.getStackTrace(e));
                throw e;
            }
            return obj;
        }
    
        /**
         * 判断是否为get
         *
         * @return
         */
        private boolean judgeIsGet() {
            if (!SwitchConfig.forbidRequest) {
                return true;
            }
            //request
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            if (request.getMethod().equalsIgnoreCase(RequestMethod.GET.name())) {
                return true;
            } else if (request.getMethod().equalsIgnoreCase(RequestMethod.POST.name())) {
                return false;
            } else {
                return true;
            }
        }
    
        private Object getResult(ProceedingJoinPoint pig, Object obj) throws NoSuchMethodException {
            Method method = ((MethodSignature) pig.getSignature()).getMethod();
            Class<?> returnType = pig.getTarget().getClass().getMethod(method.getName(), method.getParameterTypes()).getReturnType();
            if (Result.class.equals(returnType)) {
                obj = Results.newFailedResult(CommonStateCode.FAILED,SwitchConfig.requestForbidEssay);
            }
            return obj;
        }
    }
    
    更多相关内容
  • 拦截post请求关键js代码 文章源地址: https://blog.csdn.net/weixin_40855673/article/details/121575150?spm=1001.2014.3001.5501
  • post乱码拦截

    2018-07-09 16:57:26
    javapost请求乱码拦截器,记录一下!以后获取会用的上
  • 本次源码可以拦截浏览器的封包(也就是post get一类的) 测试飞车的一目了然效果,还有明文的数据包
  • 易语言服务器客户数据包拦截源码,服务器客户数据包拦截
  • 主要介绍了Android拦截并获取WebView内部POST请求参数 的实现方法,本文通过两种方案给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 2.要拦截的请求不是get请求,而是一个post请求 (难点在于:如果拦截的请求是get请求的话,我只需要拿到url,将后面拼接的参数键值对取出来就好了,但是post请求的参数键值对我们是看不到的。。。) 解决重点: 重写...
  • springboot Post 请求拦截Body参数

    千次阅读 2020-05-11 21:51:05
    springboot Post 请求拦截Body参数 应用场景 想捕获请求发过来的所有参数(包含也许 接收类 不包含的字段) 想查看 Feign 远程接口 进行的序列化是否如愿 简单问一句,你知道 Feign 接口参数类如果包含一个域 是 ...

    springboot Post 请求拦截Body参数

    应用场景

    1. 想捕获请求发过来的所有参数(包含也许 接收类 不包含的字段)
    2. 想查看 Feign 远程接口 进行的序列化是否如愿

      简单问一句,你知道 Feign 接口参数类如果包含一个域 是 Class 类型的话,序列化的结果是啥吗?还有如果 Feign 如果传递时间 Date 是否会有问题呢?

    注意事项

    1. 记得body里面的参数是储存在 输入流 里的,如果你的拦截器读取了输入流,那么这个输入流就不会再有参数了,即到达 Controller的参数为空的

    代码

    拦截器

    @Component
    public class AuthSecurityInterceptor extends HandlerInterceptorAdapter {
        private Logger logger = LoggerFactory.getLogger(AuthSecurityInterceptor.class);
    
        @Override
        public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
            String body = getBody(httpServletRequest);
            System.out.println(body);
            return true;// true 则继续执行
        }
    
        public String getBody(HttpServletRequest request) {
            StringBuilder stringBuilder = new StringBuilder();
            BufferedReader bufferedReader = null;
            InputStream inputStream = null;
            try {
                inputStream = request.getInputStream();
                if (inputStream != null) {
                    bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    char[] charBuffer = new char[128];
                    int bytesRead = -1;
                    while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                        stringBuilder.append(charBuffer, 0, bytesRead);
                    }
                } else {
                    stringBuilder.append("");
                }
            } catch (IOException ex) {
    
            } finally {
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return stringBuilder.toString();
        }
    
        @Override
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    
        }
    
        @Override
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        }
    

    配置类

    @Configuration
    public class WebSecurityConfig extends WebMvcConfigurerAdapter {
        
        @Bean
        public AuthSecurityInterceptor getSecurityInterceptor() {
            return new AuthSecurityInterceptor();
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            InterceptorRegistration addInterceptor = registry.addInterceptor(getSecurityInterceptor());
    
            // 拦截配置
            addInterceptor.addPathPatterns("/**");
        }
    }
    

    参考

    1. spring boot拦截器中获取request post请求中的参数

    做个笔记,以免以后忘记

    展开全文
  • 主要介绍了Vue axios全局拦截 get请求、post请求、配置请求的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • java使用拦截拦截post请求中的内容

    千次阅读 2020-06-01 16:56:49
    给废了段时间,然后顺便记一下, 需求: 写一个拦截器,拦截前台传来的含有表情的json串,如果有表情返回异常,没有继续走下去, 问题: 在使用拦截器获取post请求中的body信息的时候,无论是使用request.getReader()方法还是...

    首先我们的项目是前后分离的,
    然后今天有个需求就是如果在前台app请求的时候有可能会传来一些表情什么的,因为后台的数据库字段使用的是varchar接收的,会引起一些不必要的麻烦,即使把表情放到了数据库中,前台渲染也是个麻烦事,
    所以经过和领导商量就直接用拦截器给把传过来的表情拦了,直接报400,然后返回错误信息,前台提醒就完了,

    本想着挺简单个工作,被一个拦截器获取POST请求中的JSON信息 给废了段时间,然后顺便记一下,

    需求: 写一个拦截器,拦截前台传来的含有表情的json串,如果有表情返回异常,没有继续走下去,
    问题: 在使用拦截器获取post请求中的body信息的时候,无论是使用request.getReader()方法还是使用request.getInputStream() 方法,
    在获取JSON信息后,后面日志就紧跟着开始报异常getReader() has already been called for this request
    然后翻阅了网上各种论坛,开始汲取各种大佬们的经验,头发以肉眼可见的速度掉着,这里省略10个字……


    先来波解决思路
    使用HttpServletRequestWrapper来包装HttpServletRequest,在BodyHttpServletRequestWrapper中初始化读取request的Reader数据,以byte[]形式缓存在其中,然后在filter中将request转换为包装过的request

    直接上代码

    filter

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    /**
     * @author zhaopeng
     * @Description: HttpServletRequest替换的filter
     * @email zp152527@163.com
     */
    public class HttpServletRequestReplacedFilter implements Filter {
        @Override
        public void destroy() {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain) throws IOException, ServletException {
    
            ServletRequest requestWrapper = null;
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpServletRequest = (HttpServletRequest) request;
                if ("POST".equals(httpServletRequest.getMethod().toUpperCase())
                        ) {
                    requestWrapper = new BodyHttpServletRequestWrapper(
                            (HttpServletRequest) request);
                }
            }
    
            if (requestWrapper == null) {
                chain.doFilter(request, response);
            } else {
                chain.doFilter(requestWrapper, response);
            }
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
    
        }
    
    }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    BodyHttpServletRequestWrapper

    
    import javax.servlet.ReadListener;
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    import java.util.Enumeration;
    
    /**
     * @author zhaopeng
     * @Description: bodyReader包装request
     * @email zp152527@163.com
     */
    public class BodyHttpServletRequestWrapper extends
            HttpServletRequestWrapper {
    
        private final byte[] body;
    
        public BodyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            Enumeration e = request.getHeaderNames()   ;
            while(e.hasMoreElements()){
                String name = (String) e.nextElement();
                String value = request.getHeader(name);
    
            }
            body = HttpHelper.getBodyString(request).getBytes(Charset.forName("UTF-8"));
        }
    
        @Override
        public BufferedReader getReader() throws IOException {
            return new BufferedReader(new InputStreamReader(getInputStream()));
        }
    
        @Override
        public ServletInputStream getInputStream() throws IOException {
    
            final ByteArrayInputStream bais = new ByteArrayInputStream(body);
    
            return new ServletInputStream() {
                @Override
                public boolean isFinished() {
                    return false;
                }
    
                @Override
                public boolean isReady() {
                    return false;
                }
    
                @Override
                public void setReadListener(ReadListener readListener) {
    
                }
    
                @Override
                public int read() throws IOException {
                    return bais.read();
                }
            };
        }
    
        @Override
        public String getHeader(String name) {
            return super.getHeader(name);
        }
    
        @Override
        public Enumeration<String> getHeaderNames() {
            return super.getHeaderNames();
        }
    
        @Override
        public Enumeration<String> getHeaders(String name) {
            return super.getHeaders(name);
        }
    
    }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    获取请求body

    
    import javax.servlet.ServletRequest;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    
     /**
         * @Description: 获取请求body
         * @author zhaopeng
         * @email zp152527@163.com
         * @date 2018/8/24 18:15
         */
    public class HttpHelper {
        public static String getBodyString(ServletRequest request) {
            StringBuilder sb = new StringBuilder();
            InputStream inputStream = null;
            BufferedReader reader = null;
            try {
                inputStream = request.getInputStream();
                reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return sb.toString();
        }
    }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    web.xml中配置filter

        <filter>
            <filter-name>httpServletRequestReplacedFilter</filter-name>
            <filter-class>top.qujiali.core.filter.HttpServletRequestReplacedFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>httpServletRequestReplacedFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    把上面的代码直接拷贝到你的项目中,然后就会先走filter再走拦截器了,后面就可以读取了

    然后就是我们要对拦截到的内容进行处理了

    拦截器

    package com.qujiali.core.interceptor;
    
    import top.qujiali.core.exception.ParamExcetpion;
    import top.qujiali.core.interceptor.BaseInterceptor;
    import top.qujiali.core.util.Emoji;
    import top.qujiali.core.util.GetConstantsUtil;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.BufferedReader;
    
    public class EmojiInterceptor extends BaseInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            StringBuilder sb = new StringBuilder();
            String line;
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            String body = sb.toString();
            boolean emoji = Emoji.containsEmoji(body);
            if (emoji) {
                throw new ParamExcetpion(GetConstantsUtil.NOTEMOJI);//这里是我自己封装了一个异常,根据自己需要写自己的异常
            }
    
            return super.preHandle(request, response, handler);
    
        }
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在项目中配置拦截器的地方配置好拦截器
    <bean class="com.qujiali.core.interceptor.EmojiInterceptor"/>

    工具类

    package top.qujiali.core.util;
    
    import org.apache.commons.lang3.StringUtils;
    
    public class Emoji {
    
        /**
         * @Description: 是否有表情判断
         * @author zhaopeng
         * @email zp152527@163.com
         * @date 2018/8/24 18:27
         */
        public static boolean containsEmoji(String source) {
            int len = source.length();
            boolean isEmoji = false;
            for (int i = 0; i < len; i++) {
                char hs = source.charAt(i);
                if (0xd800 <= hs && hs <= 0xdbff) {
                    if (source.length() > 1) {
                        char ls = source.charAt(i + 1);
                        int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                        if (0x1d000 <= uc && uc <= 0x1f77f) {
                            return true;
                        }
                    }
                } else {
                    // non surrogate
                    if (0x2100 <= hs && hs <= 0x27ff && hs != 0x263b) {
                        return true;
                    } else if (0x2B05 <= hs && hs <= 0x2b07) {
                        return true;
                    } else if (0x2934 <= hs && hs <= 0x2935) {
                        return true;
                    } else if (0x3297 <= hs && hs <= 0x3299) {
                        return true;
                    } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d
                            || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c
                            || hs == 0x2b1b || hs == 0x2b50 || hs == 0x231a) {
                        return true;
                    }
                    if (!isEmoji && source.length() > 1 && i < source.length() - 1) {
                        char ls = source.charAt(i + 1);
                        if (ls == 0x20e3) {
                            return true;
                        }
                    }
                }
            }
            return isEmoji;
        }
    
        private static boolean isEmojiCharacter(char codePoint) {
            return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
                    || (codePoint == 0xD)
                    || ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
                    || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
                    || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
        }
    
        /**
         * @Description: 过滤emoji 或者 其他非文字类型的字符
         * @author zhaopeng
         * @email zp152527@163.com
         * @date 2018/8/24 18:27
         */
        public static String filterEmoji(String source) {
            if (StringUtils.isBlank(source)) {
                return source;
            }
            StringBuilder buf = null;
            int len = source.length();
            for (int i = 0; i < len; i++) {
                char codePoint = source.charAt(i);
                if (isEmojiCharacter(codePoint)) {
                    if (buf == null) {
                        buf = new StringBuilder(source.length());
                    }
                    buf.append(codePoint);
                }
            }
            if (buf == null) {
                return source;
            } else {
                if (buf.length() == len) {
                    buf = null;
                    return source;
                } else {
                    return buf.toString();
                }
            }
        }
    }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    这样就可以了,其实主要就是ServletRequest中getReader()和getInputStream()两个方法都注明方法只能被调用一次,由于RequestBody是流的形式读取,那么流读了一次就没有了,所以只能被调用一次
    既然是因为流只能读一次的原因,那么只要将流的内容保存下来,就可以实现反复读取了,这样问题也就解决了

    好的到这里本篇文章就先到此了,创作不易,如果那里有不合适的地方还请大家多多指教,写这篇博的目的主要就是为了方便自己以后的一个回忆和朋友学习时的一个参考,希望为大家可以带来帮助 ~ ~&

    虚心的去学习,自信的去工作~

    首先我们的项目是前后分离的,
    然后今天有个需求就是如果在前台app请求的时候有可能会传来一些表情什么的,因为后台的数据库字段使用的是varchar接收的,会引起一些不必要的麻烦,即使把表情放到了数据库中,前台渲染也是个麻烦事,
    所以经过和领导商量就直接用拦截器给把传过来的表情拦了,直接报400,然后返回错误信息,前台提醒就完了,

    本想着挺简单个工作,被一个拦截器获取POST请求中的JSON信息 给废了段时间,然后顺便记一下,

    需求: 写一个拦截器,拦截前台传来的含有表情的json串,如果有表情返回异常,没有继续走下去,
    问题: 在使用拦截器获取post请求中的body信息的时候,无论是使用request.getReader()方法还是使用request.getInputStream() 方法,
    在获取JSON信息后,后面日志就紧跟着开始报异常getReader() has already been called for this request
    然后翻阅了网上各种论坛,开始汲取各种大佬们的经验,头发以肉眼可见的速度掉着,这里省略10个字……


    先来波解决思路
    使用HttpServletRequestWrapper来包装HttpServletRequest,在BodyHttpServletRequestWrapper中初始化读取request的Reader数据,以byte[]形式缓存在其中,然后在filter中将request转换为包装过的request

    直接上代码

    filter

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    /**
     * @author zhaopeng
     * @Description: HttpServletRequest替换的filter
     * @email zp152527@163.com
     */
    public class HttpServletRequestReplacedFilter implements Filter {
        @Override
        public void destroy() {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain) throws IOException, ServletException {
    
            ServletRequest requestWrapper = null;
            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpServletRequest = (HttpServletRequest) request;
                if ("POST".equals(httpServletRequest.getMethod().toUpperCase())
                        ) {
                    requestWrapper = new BodyHttpServletRequestWrapper(
                            (HttpServletRequest) request);
                }
            }
    
            if (requestWrapper == null) {
                chain.doFilter(request, response);
            } else {
                chain.doFilter(requestWrapper, response);
            }
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
    
        }
    
    }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    BodyHttpServletRequestWrapper

    
    import javax.servlet.ReadListener;
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    import java.util.Enumeration;
    
    /**
     * @author zhaopeng
     * @Description: bodyReader包装request
     * @email zp152527@163.com
     */
    public class BodyHttpServletRequestWrapper extends
            HttpServletRequestWrapper {
    
        private final byte[] body;
    
        public BodyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            Enumeration e = request.getHeaderNames()   ;
            while(e.hasMoreElements()){
                String name = (String) e.nextElement();
                String value = request.getHeader(name);
    
            }
            body = HttpHelper.getBodyString(request).getBytes(Charset.forName("UTF-8"));
        }
    
        @Override
        public BufferedReader getReader() throws IOException {
            return new BufferedReader(new InputStreamReader(getInputStream()));
        }
    
        @Override
        public ServletInputStream getInputStream() throws IOException {
    
            final ByteArrayInputStream bais = new ByteArrayInputStream(body);
    
            return new ServletInputStream() {
                @Override
                public boolean isFinished() {
                    return false;
                }
    
                @Override
                public boolean isReady() {
                    return false;
                }
    
                @Override
                public void setReadListener(ReadListener readListener) {
    
                }
    
                @Override
                public int read() throws IOException {
                    return bais.read();
                }
            };
        }
    
        @Override
        public String getHeader(String name) {
            return super.getHeader(name);
        }
    
        @Override
        public Enumeration<String> getHeaderNames() {
            return super.getHeaderNames();
        }
    
        @Override
        public Enumeration<String> getHeaders(String name) {
            return super.getHeaders(name);
        }
    
    }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    获取请求body

    
    import javax.servlet.ServletRequest;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    
     /**
         * @Description: 获取请求body
         * @author zhaopeng
         * @email zp152527@163.com
         * @date 2018/8/24 18:15
         */
    public class HttpHelper {
        public static String getBodyString(ServletRequest request) {
            StringBuilder sb = new StringBuilder();
            InputStream inputStream = null;
            BufferedReader reader = null;
            try {
                inputStream = request.getInputStream();
                reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return sb.toString();
        }
    }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    web.xml中配置filter

        <filter>
            <filter-name>httpServletRequestReplacedFilter</filter-name>
            <filter-class>top.qujiali.core.filter.HttpServletRequestReplacedFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>httpServletRequestReplacedFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    把上面的代码直接拷贝到你的项目中,然后就会先走filter再走拦截器了,后面就可以读取了

    然后就是我们要对拦截到的内容进行处理了

    拦截器

    package com.qujiali.core.interceptor;
    
    import top.qujiali.core.exception.ParamExcetpion;
    import top.qujiali.core.interceptor.BaseInterceptor;
    import top.qujiali.core.util.Emoji;
    import top.qujiali.core.util.GetConstantsUtil;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.BufferedReader;
    
    public class EmojiInterceptor extends BaseInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            StringBuilder sb = new StringBuilder();
            String line;
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            String body = sb.toString();
            boolean emoji = Emoji.containsEmoji(body);
            if (emoji) {
                throw new ParamExcetpion(GetConstantsUtil.NOTEMOJI);//这里是我自己封装了一个异常,根据自己需要写自己的异常
            }
    
            return super.preHandle(request, response, handler);
    
        }
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在项目中配置拦截器的地方配置好拦截器
    <bean class="com.qujiali.core.interceptor.EmojiInterceptor"/>

    工具类

    package top.qujiali.core.util;
    
    import org.apache.commons.lang3.StringUtils;
    
    public class Emoji {
    
        /**
         * @Description: 是否有表情判断
         * @author zhaopeng
         * @email zp152527@163.com
         * @date 2018/8/24 18:27
         */
        public static boolean containsEmoji(String source) {
            int len = source.length();
            boolean isEmoji = false;
            for (int i = 0; i < len; i++) {
                char hs = source.charAt(i);
                if (0xd800 <= hs && hs <= 0xdbff) {
                    if (source.length() > 1) {
                        char ls = source.charAt(i + 1);
                        int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                        if (0x1d000 <= uc && uc <= 0x1f77f) {
                            return true;
                        }
                    }
                } else {
                    // non surrogate
                    if (0x2100 <= hs && hs <= 0x27ff && hs != 0x263b) {
                        return true;
                    } else if (0x2B05 <= hs && hs <= 0x2b07) {
                        return true;
                    } else if (0x2934 <= hs && hs <= 0x2935) {
                        return true;
                    } else if (0x3297 <= hs && hs <= 0x3299) {
                        return true;
                    } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d
                            || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c
                            || hs == 0x2b1b || hs == 0x2b50 || hs == 0x231a) {
                        return true;
                    }
                    if (!isEmoji && source.length() > 1 && i < source.length() - 1) {
                        char ls = source.charAt(i + 1);
                        if (ls == 0x20e3) {
                            return true;
                        }
                    }
                }
            }
            return isEmoji;
        }
    
        private static boolean isEmojiCharacter(char codePoint) {
            return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
                    || (codePoint == 0xD)
                    || ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
                    || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
                    || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
        }
    
        /**
         * @Description: 过滤emoji 或者 其他非文字类型的字符
         * @author zhaopeng
         * @email zp152527@163.com
         * @date 2018/8/24 18:27
         */
        public static String filterEmoji(String source) {
            if (StringUtils.isBlank(source)) {
                return source;
            }
            StringBuilder buf = null;
            int len = source.length();
            for (int i = 0; i < len; i++) {
                char codePoint = source.charAt(i);
                if (isEmojiCharacter(codePoint)) {
                    if (buf == null) {
                        buf = new StringBuilder(source.length());
                    }
                    buf.append(codePoint);
                }
            }
            if (buf == null) {
                return source;
            } else {
                if (buf.length() == len) {
                    buf = null;
                    return source;
                } else {
                    return buf.toString();
                }
            }
        }
    }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    这样就可以了,其实主要就是ServletRequest中getReader()和getInputStream()两个方法都注明方法只能被调用一次,由于RequestBody是流的形式读取,那么流读了一次就没有了,所以只能被调用一次
    既然是因为流只能读一次的原因,那么只要将流的内容保存下来,就可以实现反复读取了,这样问题也就解决了

    好的到这里本篇文章就先到此了,创作不易,如果那里有不合适的地方还请大家多多指教,写这篇博的目的主要就是为了方便自己以后的一个回忆和朋友学习时的一个参考,希望为大家可以带来帮助 ~ ~&

    虚心的去学习,自信的去工作~

    展开全文
  • 问题描述: 今天遇到个比较坑的问题,后端给的post请求接口,使用ajax请求...原来axios 的post默认参数格式为字符串,因此传递给后端的数据需要使用axios请求拦截器对post请求的参数做下处理。 问题解决: (1)...

    问题描述:

    今天遇到个比较坑的问题,后端给的post请求接口,使用ajax请求可以拿到数据,返回都是正常的,但是使用axios请求数据,一直返回异常,而且发现传给后端的数据,莫名的被添加上了引号,变成了字符串,这是怎么回事呢?

    问题存在原因:

    原来axios 的post默认参数格式为字符串,因此传递给后端的数据需要使用axios请求拦截器对post请求的参数做下处理。

    问题解决:

    (1)引入qs库(这个库在安装axios 的时候,默认就被安装了,无需再次安装)

    (2)import qs from ' qs '

    (3)对data数据进行处理:   var data = qs.stringify( post请求传入的data数据 );     // 最终拿到的data 是经过处理的。

    更多详细内容参考:https://blog.csdn.net/qq_35713752/article/details/99545158

    展开全文
  • 有时为了能更好的完成测试工作,提高软件质量,只是功能测试方法已经不能满足需求,所以需要根据项目的特点加入合适的测试...下面我尽可能详细的描述下我用fiddler对APP的get和post请求进行拦截和篡改的步骤: 以下省去
  • axios post 请求传递request-body request-query headers(get 或者不直接使用get、post使用axios 道理方法都类似,注意:get没有请求体,如果要用get方法,后端就不能用@requestBody来接收,相应可以改为@...
  • https://www.cnblogs.com/muhy/p/10506062.html https://www.cnblogs.com/gs008/articles/12579725.html
  • Android拦截并获取WebView内部POST请求参数 起因 实现过程 ~~方案一~~ 方案二 反思 GitHub地址:[webview_post_data](https://github.com/lxr17/webview_post_data) 起因 有些时候自家APP中嵌入的H5页面并不是...
  • get方法/post方法应用拦截

    千次阅读 2017-12-17 20:02:20
    1.get方法拦截器 public static void doGet1(String oldUrl, Callback callback) { //要添加的公共参数...map Map,String> map = new HashMap; map.put("source","android"); StringBuilder stringBuilder = ...
  • [HttpPost] public IActionResult Index([FromJsonKey]int page) { return Json(page); } [HttpPost()] public IActionResult AddUser([FromJsonKey]int id,[FromJsonKey]User user) { return Json(new {id...
  • 第一步还是先下载axios npm install axios --save ...//http request 拦截器 axios.interceptors.request.use( config => { // const token = getCookie('名称'); config.data = JSON.stringify(config.data)
  • 接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个sign=xxxx 的标志位,同时添加手机本地的数据比如 sessionToken=sd54f5sd4ffsdf45454564 、deviceId=863970025919887
  • SpringBoot-拦截

    千次阅读 多人点赞 2021-10-23 17:02:22
    在 Spring MVC 中我们实现了拦截器的功能,拦截器就是AOP的一种实现。 在 Spring MVC 中实现的拦截器参考:SpringMVC-拦截器 1. 拦截器 在 Spring Boot 可以可以在以下情况执行操作: 在将请求发送到控制器之前 在...
  • 使用spring security 做的安全框架时,会自动拦截post,put,delete等请求,这时因为spring security 开启了防止跨域访问攻击的配置,那么怎么解决呢?请往下看: 我使用了thymeleaf在网页的head中添加: &...
  • Vue中的请求拦截器和响应拦截

    千次阅读 2021-09-11 20:57:07
    大家好,我又来了,我们今天就讲一下什么是请求拦截器,和请求拦截器的作用,好了,多余的话我就不说了,马上开始今天的讲解 开始啦 请求拦截器 请求拦截器的作用是: 在请求发送前进行一些操作,例如在每个请求...
  • axios请求拦截

    千次阅读 2021-11-18 16:47:56
    main.js中添加axios请求前拦截器、接受拦截器 import axios from 'axios' // 添加请求拦截器,在请求头中加token,Cookie axios.interceptors.request.use( config => { if (localStorage.getItem('...
  • 1.首先post请求时在拦截器直接getPramer获取不到值,然后采用流读取请求数据,但是数据只能读取一次, 在控制层就会报错获取不到数据,借鉴别人的做法,做个笔记 ......
  • spring mvc拦截POST请求防CSRF攻击

    千次阅读 2015-08-06 14:54:57
     CsrfInterceptor 对于post请求进行拦截,检测csrfToken是否匹配  跳至   [1]   [2]   [3]   [4]   [5]   [6]   [7] ? 1 2 3 4 5 6 7 8 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 127,063
精华内容 50,825
关键字:

post拦截

友情链接: font_Times_New_Roman_14.rar