过滤器Filter(非常非常重要)

过滤器就是用来过滤的

过滤器既可以浏览器发送给服务器的请求(有一些请求是垃圾请求,不需要处理)

也可以过滤服务器发送给浏览器的响应(有时候响应是乱码,应该先转码再发送给浏览器)

在访问web资源之前,可以对浏览器发给tomcat服务器的请求要求进行检查

在访问web资源之后,也可以对tomcat服务器发给浏览器的响应进行检查

 代码实现过滤器机制:(通过过滤器解决请求和响应的乱码问题)

新建一个类,实现Filter过滤器接口

public class CharacterEncodingFilter implements Filter
{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
    {
        //给请求和响应设置编码格式,这样就不会乱码了
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");

        //这行代码是固定的代码,必须写这行代码
        chain.doFilter(request,response);//让我们的请求继续走,如果不写,程序到这里就被拦截停止了
    }

    @Override
    public void destroy()
    {
        Filter.super.destroy();
    }
}

在web.xml中进行注册


    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.kuang.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--/*表示在浏览器中输入任何路径都会先经过这个过滤器-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

这时侯所有的请求和响应都会先走一遍过滤器

利用过滤器实现:用户登录之后才能进入主页,用户注销之后就不能进入主页

(1)登录成功跳转到登陆成功的页面,登陆失败跳转到登录失败的页面

public class LoginServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        //获取请求中的username这个key的value
        String username=request.getParameter("useename");

        if(username.equals("admin")//登录成功
        {
            //登陆成功就把用户信息放到session里面
            request.getSession().setAttribute("USER_SESSION",request.getSession().getId());

            //登陆成功就跳转到登陆成功的页面
            response.sendRedirect("/sys/success.jsp");
        }
        else//登录失败
        {
            //登陆失败就跳转到登陆失败的页面
            response.sendRedirect("/sys/fail.jsp");
        }
    }
}

(2)退出账号

public class LogoutServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Object user_session=request.getSession().getAttribute("USER_SESSION");

        //如果session里USER_SESSION这个key的value不为空,说明用户登录成功了,把value值清空了,用户就退出登录了
        if(user_session!=null)
        {
            request.getSession().removeAttribute("USER_SESSION");
            //重定向到登录页面
            response.sendRedirect("/Login.jsp");
        }
    }
}

通过过滤器可以对服务器管理的所有 Web 资源(例如 JSP、Servlet、静态 HTML 文件、静态图片等)进行拦截,从而实现一些特殊的功能,例如用户的权限控制、过滤敏感词、设置统一编码格等。

  1. 客户端请求访问容器内的 Web 资源。
  2. Servlet 容器接收请求,并针对本次请求分别创建一个 request 对象和 response 对象。
  3. 请求到达 Web 资源之前,先调用 Filter 的 doFilter() 方法,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。
  4. 在 Filter 的 doFilter() 方法内,调用 FilterChain.doFilter() 方法,将请求传递给下一个过滤器或目标资源。
  5. 目标资源生成响应信息返回客户端之前,处理控制权会再次回到 Filter 的 doFilter() 方法,执行 FilterChain.doFilter() 后的语句,检查 response 对象,修改响应头和响应正文。
  6. 响应信息返回客户端。

部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。

另一个例子:

效果:打开浏览器访问http://localhost:8080/test1?name=cc,结果返回success字符串

而控制台中打印了:只获取第一个key:value对,第二个第三个不获取

请求的参数名字:name

请求的值:[cc]

@ResponseBody
@GetMapping("/test1")
public String test1(){
    return "success";
}
public class MyHttpFilter implements Filter
{

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
    {
        //获取访问的url
        HttpServletRequest servletRequest=(HttpServletRequest) servletRequest;
        String requestUrl= servletRequest.getRequestURI();

        //如果访问路径时localhost:8080/test1,那说明这个请求就是我们要拦截的对象
        if(requestUrl.equals("/test1"))
        {
            Map  map=servletRequest.getParameterMap();
            for(entry:map.entrySet())
            {
                System.out.println("请求的参数名字是:"+entry.getKey());
                System.out.println("请求的值是:"+entry.getValue());
                return;
            }
        }
        //放行,继续处理后面的业务
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在计算机编程中,filter过滤器)是一种常用的函数或方法,它用于筛选序列中符合特定条件的元素,将符合条件的元素构成一个新的序列返回filter函数接收两个参数:第一个参数是一个函数(即过滤条件),第二个参数是一个序列(通常是列表、元组、集合等可迭代对象)。该函数会依次对序列中的每个元素执行过滤条件,如果符合条件,则将该元素加入新的序列中,最后将新的序列返回。 例如,下面的代码使用filter函数从一个列表中筛选出所有偶数: ``` numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] def is_even(number): return number % 2 == 0 even_numbers = list(filter(is_even, numbers)) print(even_numbers) # 输出 [2, 4, 6, 8, 10] ``` 在上面的例子中,is_even函数是过滤条件,它接收一个数作为参数,如果该数是偶数,则返回True,否则返回False。filter函数将is_even函数依次应用于numbers列表中的每个元素,筛选出符合条件的偶数,并将它们构成一个新的列表even_numbers返回filter函数可以用lambda表达式代替定义函数,例如上面的代码也可以写成: ``` numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) print(even_numbers) # 输出 [2, 4, 6, 8, 10] ``` 在实际编程中,filter函数可以用于对数据进行筛选、过滤、排序等操作,非常实用。 ### 回答2: filter过滤器是一种常见的数据处理工具,在计算机编程中被广泛使用。它用于从一组数据中选择出符合特定条件的元素,形成一个新的数据集合。 filter过滤器通常由一个函数和一个数据集合组成。这个函数被称为过滤条件或过滤规则,用来判断数据集合中的每个元素是否符合条件。如果符合条件,该元素将被保留,否则将被过滤掉。 在使用过滤器时,程序员可以自定义过滤条件函数来满足具体需求。这个函数一般会接受一个参数,即数据集合中的每个元素,然后返回一个布尔型值。如果返回值为True,该元素将被保留,如果返回值为False,该元素将被过滤掉。 过滤器可以应用于不同类型的数据集合,比如列表、数组、字典等。它有助于快速筛选出符合特定条件的数据,提高数据处理的效率和精确度。 使用filter过滤器的好处是可以减少冗余的代码和提高可读性。通过使用过滤器,可以将筛选数据的逻辑与数据处理的逻辑分离开来,使程序结构更清晰、易于维护。 总之,filter过滤器是一种方便实用的数据处理工具,它能够根据自定义的过滤条件对数据集合进行筛选,保留符合条件的元素,从而得到一个新的数据集合。它在编程中的应用非常广泛,可以大大提高数据处理的效率和精确度。 ### 回答3: 过滤器Filter)是一种Web开发中常用的工具,用于对请求进行预处理和拦截操作。它可以在请求发送到目标资源之前对请求进行修改或者进行一些必要的操作。 过滤器通常被用于以下几个方面: 1. 访问控制:过滤器可以检查用户的登录状态、权限等信息,根据不同的条件来判断是否允许用户访问某个资源。 2. 参数预处理:过滤器可以对请求中的参数进行校验、过滤和预处理,确保参数符合要求并且没有恶意代码。 3. 编码解码:过滤器可以对请求和响应的数据进行编码解码的处理,防止乱码和安全问题。 4. 日志记录:过滤器可以记录请求的日志,包括请求的URL、IP、时间等信息,用于后续的分析和定位问题。 5. 性能监控:过滤器可以监控请求的处理时间,用于统计和分析系统的性能瓶颈,从而进行性能优化。 在Java Web开发中,过滤器是通过实现javax.servlet.Filter接口来创建的。过滤器需要在web.xml文件中进行配置,指定过滤器的名称、匹配的URL路径和执行的顺序等信息。 过滤器的执行过程是在请求到达目标资源之前,先经过过滤器的doFilter方法,然后再传递给下一个过滤器或者目标资源。过滤器可以对请求进行修改,并且可以选择是否将请求传递给下一个过滤器或者目标资源。 总结来说,过滤器是一种可以对请求进行预处理和拦截的工具,用于实现访问控制、参数预处理、编码解码、日志记录和性能监控等功能。它在Web开发中起到了非常重要的作用,提高了系统的安全性和可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值