欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java过滤器

程序员文章站 2022-07-05 22:26:00
...

过滤器
过滤器是出于客户端与服务器资源文件之间俺的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改,也可以响应进行过滤,拦截或修改响应。
在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行操作。
常有代码有:获取请求,获取响应,获取session,放行。

在项目里写一个字符串资源库,用于响应服务器的字符串作匹配

hello.txt
你大爷=***
傻B=**
妈的智障=****

`先创建一个helloServlet类

import com.sun.net.httpserver.HttpServer;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("hello/info")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");

        String info = (String) req.getParameter("info");
        //resp.setContentType("application/text;charset=utf-8");
        HttpSession session = req.getSession();
        session.setAttribute("info", info);
        resp.sendRedirect("demo.jsp");

    }
}

再简单的创建一个demo.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="hello/info" method="post">
    <textarea  cols="30" rows="10"></textarea>
    <button type="submit">提交</button>
</form>
</body>
</html>

接着编写helloFilter类并实现

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.*;
import java.util.Objects;

@WebFilter("/*")
public class HelloFilter implements Filter{


    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        request.setCharacterEncoding("utf-8");
        System.out.println("来了,老弟");

        String info=request.getParameter("info");
        if(Objects.nonNull(info))){

            //使用IO中的字符流,读取每一行数据
            InputStream is= HelloFilter.class.getClassLoader().getResourceAsStream("hello.txt");//固定写法
            //字节流转换为字符流-->转换流
            Reader isr= new InputStreamReader(is);
            //缓冲流读取
            BufferedReader br=new BufferedReader(isr);

            //循环读取每一行
            String line=null;
            //替换敏感字符
            while ((line=br.readLine())!=null){
                String[] split=line.split("=");
                info=   info.replace(split[0],split[1]);
                info.replace(split[0],split[1]);
            }
            //把替换完的信息,重新返回到request对象中
            request.setAttribute("info",info);
        }

        chain.doFilter(request,response);
    }

    public void destroy() {

    }
}

运行结果如下:
![在客户端输入的字符串](https://img-blog.csdnimg.cn/20191107003156824.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pha2luRWpha2lu,size_16,color_FFFFFF,t_70)

![经过过滤器修改后提交的字符串](https://img-blog.csdnimg.cn/20191107003440369.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pha2luRWpha2lu,size_16,color_FFFFFF,t_70)
`` `运行的结果就是你在客户端输入的字符串有我上面hello.txt里面的字符串时就会用*(星号)代替,就完成了这个过滤拦截并修改功能,很多时候也就避免了出现很多敏感字符。
	无聊时顺便写的,也是本人第一次写博客,望谅解!
相关标签: 程序猿的日常