Spring 使用过滤器

Spring 使用过滤器

过滤器主要作用更改我们的请求参数,在前台请求后台的过程中做一些我们想做的事情,首先是继承Filter,这是必要的,然后重写doFilter方法,这个方法也就是我们做事情的方法,
然后我们还需要一个类来整改我们的请求参数,毕竟我们的请求参数都是在request里面,可能是用getParameter获取,或者直接是在IO流里获取,至于可能有其他方式,我也不清楚,
好,我们新建一个类MyHttpServletRequestWrapper继承HttpServletRequestWrapper
里面放两个参数,一个是放parameter里面的参数,一个是放IO流的数据

// 用于存储请求参数
private Map<String , String[]> params = new HashMap<String, String[]>();

// 存放JSON数据主体
private String body;

然后添加一个构造方法,
public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream 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) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
}
这个构造主要是把IO流里面的数据变成字符串,因为Spring接受参数的时候不一定是调用getParameter,可能直接用注解@RequestBody,这个注解是直接把IO流数据直接转换成对象的,我们若是用了次注解还想改里面的参数就需要把IO流先转换成对应的JSON格式的字符串,再在这个字符串里加入我们想要的参数,然后再转换回来;
然后重写getInputStream()方法,这个是把我们转换过的字符串再转换成IO流,
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes(“UTF-8”));
ServletInputStream servletInputStream = new ServletInputStream() {
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
@Override
public boolean isFinished() {
return false;
}

        @Override
        public boolean isReady() {
            return false;
        }

        @Override
        public void setReadListener(ReadListener listener) {
        }
    };
    return servletInputStream;
}
一定要用body这个成员变量来转,因为这才是我们更改过后的内容承载体。
添加getBody 和setBody 方法,主要是在filter里面用,因为我们修改的地方实在filter,再赋值回来。
添加setParameter方法,是用于在filter中添加的参数同步进入到请求参数,
public void setParameter(String name, Object value) {
    if (value != null) {
        if (value instanceof String[]) {
            params.put(name, (String[]) value);
        } else if (value instanceof String) {
            params.put(name, new String[]{(String) value});
        } else {
            params.put(name, new String[]{String.valueOf(value)});
        }
    }
    for(String str:params.keySet()){
        System.out.println("更改之后的请求参数:"+str+"值:"+params.get(str));
    }
}
这里是把我们更改过后或者新添加的参数同步赋值到我们的承载体里;
重写getParameter方法,使用我们的map承载体里面的参数,
    @Override
public String getParameter(String name) {
    String[]values = params.get(name);
    if(values == null || values.length == 0) {
        return null;
    }
    return values[0];
}
重写getParameterValues()方法,效果同上

好,然后我们开始写doFilter()方法,首先是判断我们什么情况下需要更改参数内容,这个看自己的需求,
然后满足需求的情况下,我们new一个MyHttpServletRequestWrapper,
MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(
                            (HttpServletRequest) request);
获取里面的body和map内容,body字符串转换成JSONObject
String body = requestWrapper.getBody();
JSONObject param = JSONObject.parseObject(body);           
添加或者修改内容那是随自己想改的内容,
然后在把改的内容再赋值回去,就是MyHttpServletRequestWrapper里面的setBody()方法,
最后是调用FilterChain.doFilter()方法,切记一点,如果修改了内容,一定要用
FilterChain.doFilter(MyHttpServletRequestWrapper,ServletResponse);//这个是我们自己重写得请求体,否在用原生的请求体。
FilterChain.doFilter(ServletRequest, ServletResponse);
我这里使用的是SpringBoot,是使用注解的方式启动,
@WebFilter(filterName = "limitsFilter", urlPatterns = "/*")
我的正则是拦截所有请求,可以自己写
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值