分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤

简介: 分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤

案例1. 利用Servlet的过滤器Filter进行完成脏话过滤

package cn.javabs.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.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
 
public class DirtyWordsFilterDemo implements Filter {
 
  public void init(FilterConfig filterConfig) throws ServletException {
 
  }
 
  public void doFilter(ServletRequest req, ServletResponse resp,
      FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request;
    HttpServletResponse response;
    try{
      request = (HttpServletRequest)req;
      response = (HttpServletResponse)resp;
    }catch(Exception e){
      throw new RuntimeException("non-http request");
    }
    DirtyWordHttpServletRequest dwrequest = new DirtyWordHttpServletRequest(request);
    chain.doFilter(dwrequest, response);
    
 
  }
 
  public void destroy() {
 
  }
 
}
class DirtyWordHttpServletRequest extends HttpServletRequestWrapper{
  private String strs[] = {"傻逼","畜生","我去年买了个包"};
  private HttpServletRequest request;
  public DirtyWordHttpServletRequest(HttpServletRequest request){
    super(request);
    this.request = request;
  }
  @Override
  public String getParameter(String name) {
    String value = request.getParameter(name);
    if(value==null)
      return null;
    for(String s:strs){
      if(value.contains(s)){
        value = value.replace(s, "**");
      }
    }
    return value;
  }
  
}

案例2. 利用Servlet的过滤器Filter进行完成Html编码过滤

package cn.javabs.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.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
 
public class HtmlFilterDemo implements Filter {
 
  public void init(FilterConfig filterConfig) throws ServletException {
 
  }
 
  public void doFilter(ServletRequest req, ServletResponse resp,
      FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request;
    HttpServletResponse response;
    try{
      request = (HttpServletRequest)req;
      response = (HttpServletResponse)resp;
    }catch(Exception e){
      throw new RuntimeException("non-http request");
    }
    
    HtmlHttpServletRequest hrequest = new HtmlHttpServletRequest(request);
    chain.doFilter(hrequest, response);
 
  }
 
  public void destroy() {
 
  }
 
}
class HtmlHttpServletRequest extends HttpServletRequestWrapper{
  private HttpServletRequest request;
  public HtmlHttpServletRequest(HttpServletRequest request){
    super(request);
    this.request = request;
  }
  @Override
  public String getParameter(String name) {
    String value = request.getParameter(name);
    if(value==null)
      return null;
    value = htmlFilter(value);
    return value;
  }
  private String htmlFilter(String message) {
    if (message == null)
            return (null);
 
        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuffer result = new StringBuffer(content.length + 50);
        for (int i = 0; i < content.length; i++) {
            switch (content[i]) {
            case '<':
                result.append("&lt;");
                break;
            case '>':
                result.append("&gt;");
                break;
            case '&':
                result.append("&amp;");
                break;
            case '"':
                result.append("&quot;");
                break;
            default:
                result.append(content[i]);
            }
        }
        return (result.toString());
  }
  
}

案例3. 利用Servlet的过滤器Filter进行完成字符编码过滤(Get及Post方式)

  package cn.javabs.filter;
 
  import java.io.IOException;
  import java.io.UnsupportedEncodingException;
 
  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.http.HttpServletRequest;
  import javax.servlet.http.HttpServletRequestWrapper;
  import javax.servlet.http.HttpServletResponse;
  /**
       * 同时解决GET及POST请求参数和响应输出的编码过滤器
       */
  public class SetAllEncodingFilterDemo implements Filter {
    private FilterConfig filterConfig;
    public void init(FilterConfig filterConfig) throws ServletException {
      this.filterConfig = filterConfig;
    }
 
    public void doFilter(ServletRequest req, ServletResponse resp,
        FilterChain chain) throws IOException, ServletException {
      HttpServletRequest request;
      HttpServletResponse response;
      try{
        request = (HttpServletRequest)req;
        response = (HttpServletResponse)resp;
      }catch(Exception e){
        throw new RuntimeException("non-http request");
      }
      String encoding = "UTF-8";
      String value = filterConfig.getInitParameter("encoding");
      if(value!=null){
        encoding = value;
      }
      
      request.setCharacterEncoding(encoding);//POST请求方式
      response.setContentType("text/html;charset="+encoding);
      MyHttpServletRequest mrequest = new MyHttpServletRequest(request);
      chain.doFilter(mrequest, response);
    }
 
    public void destroy() {
 
    }
 
  }
  class MyHttpServletRequest extends HttpServletRequestWrapper{
    private HttpServletRequest request;
    public MyHttpServletRequest(HttpServletRequest request){
      super(request);
      this.request = request;
    }
    public String getParameter(String name) {
      String value = request.getParameter(name);
      if(value==null)
        return value;
      try {
        if("get".equalsIgnoreCase(request.getMethod()))
          value = new String(value.getBytes("ISO-8859-1"),request.getCharacterEncoding());
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
      return value;
    }
    
  }
目录
相关文章
|
4天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
18天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
32 5
Java反射机制:解锁代码的无限可能
|
11天前
|
监控 Java 数据管理
java会话跟踪和拦截器过滤器
本文介绍了Web开发中的会话跟踪技术——Cookie与Session,以及过滤器(Filter)和监听器(Listener)的概念和应用。Cookie通过在客户端记录信息来识别用户,而Session则在服务器端保存用户状态。过滤器用于拦截和处理请求及响应,监听器则监控域对象的状态变化。文章详细解释了这些技术的实现方式、应用场景和主要方法,帮助开发者更好地理解和使用这些工具。
28 1
|
14天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
47 3
|
15天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
14天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
Java 缓存 应用服务中间件
Java EE 之 过滤器入门学习与总结(2)
今天就对使用Filter技术能做什么来个小小的归纳。也为了方便今后的复习。 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest request = (HttpServletRequest )req; Ht...
1022 0
|
8天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
4天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
23 9
|
7天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####