JavaWeb-过滤器高级案例、URL过滤系统

一、过滤器高级案例
  1. 过滤脏话,包装HttpServletRequestWrapper
  • 在自定义包装类中重写getParamter(String)截获用户输入的信息
  • 同时在自定义包装类中自定义一个脏词库,遍历该库,用截获的数据constain判断是否包含脏词,如果遍历到,用replaceAll替换并将替换后的数据返回
  • 在过滤器中使用自定义的包装类替换doFilter(mRequest,response)放行
  1. 过滤HTML,包装HttpServletRequest Wrapper
    • 同样在自定义包装类中获得请求数据,将数据改吧改吧后返回,改数据的方法可以参考tomcat\webApps\webapp\examples\WEB-INF\classes\util\中的文件
  2. 全站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的权限过滤系统

你可能感兴趣的:(JavaWeb)