一、过滤器高级案例
- 过滤脏话,包装HttpServletRequestWrapper
- 在自定义包装类中重写getParamter(String)截获用户输入的信息
- 同时在自定义包装类中自定义一个脏词库,遍历该库,用截获的数据constain判断是否包含脏词,如果遍历到,用replaceAll替换并将替换后的数据返回
- 在过滤器中使用自定义的包装类替换doFilter(mRequest,response)放行
- 过滤HTML,包装HttpServletRequest Wrapper
- 同样在自定义包装类中获得请求数据,将数据改吧改吧后返回,改数据的方法可以参考tomcat\webApps\webapp\examples\WEB-INF\classes\util\中的文件
- 全站Gzip压缩,包装HttpServletResponse Wrapper
- 原理图
- 自定义包装类包装HttpServletResponse Wappr,重写getOutputStream方法,该方法返回一个又自定义的包装ServletOutputStream类,该类传入自己的缓存目标对象ByteArrtyOutputStream和源对象ServletOutputStream 并重写write(int b),此步实现了双重包装,并将改写后的数据返回上两层,当调用者调用时,过滤器找的是自己重新包装的类的方法
- 自定义包装HttpServletResponse Wrapper的包装类中还需重写PrintWriter和getBytes方法,他们的作用分别是保证字节流的输出和数据的刷新
- private ByteArrayOutputStream bos = new ByteArrayOutputStream();
- private PrintWriter pw;
- public MyHttpServletResponse(HttpServletResponse response) {
- super(response);
- }
- public ServletOutputStream getOutputStream() throws IOException {
- ServletOutputStream sos = super.getOutputStream();
- return new MyServletOutputStream(sos,bos);
- }
- //重新改写字节流
- public PrintWriter getWriter() throws IOException {
- pw = new PrintWriter(new OutputStreamWriter(bos,super.getCharacterEncoding()));
- return pw;
- }
- public byte[] getBytes(){
- try {
- if(pw!=null)
- pw.close();
- bos.flush();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return bos.toByteArray();
- }
- 在过滤器中放行后使用Gzip压缩数据,在此处还需要注意的是通知客户端以Gzip解压
- chain.doFilter(request, mresponse);
- //获得原有数据
- byte[] b = mresponse.getBytes();
- System.out.println("压缩前大小1:" + b.length);
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- GZIPOutputStream gout = new GZIPOutputStream(out);
- gout.write(b);
- gout.close();
- b = out.toByteArray();
- System.out.println("压缩后大小1:" + b.length);
- response.setHeader("Content-Encoding", "gzip");
- response.getOutputStream().write(b);
二、基于URI的权限过滤系统