JavaWeb---过滤器Filter

前言

过滤器和我们生活中净水器可以说是一个道理的,就是用来过滤网站的数据。

1. Filter

Filter : 过滤器,用来过滤网站的数据
生活中的应用 : 处理中文乱码, 登录验证…
在这里插入图片描述
[1] 我们客户端发送请求时,可能带有一些中文字符,这时候服务器响应相关信息时,就得先进行过滤,让编码进行转化。
[2] 登录操作时,我们必须输入账号和密码才能进入网站首页,如果没有过滤器,我们直接打入首页的网址就可进入,那么这就存在安全性能问题。

Filter 开发步骤
实现中文编码转化的方法

package com.gs.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {

    //初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter初始化.....");
    }

    //Chain: 链
    /*
      1. 过滤中的所有代码,在过滤特定的请求是都会执行
      2. 必须要让过滤器通行
       chain.doFilter(request,response)
     */
    //过滤
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");

        System.out.println("characterEncodingFilter执行前...");
        chain.doFilter(request,response);  //让我们的请求继续
        System.out.println("characterEncodingFilter执行后...");
    }

    //销毁:web服务器关闭的时候,过滤会销毁
    @Override
    public void destroy() {
        System.out.println("CharacterEncodingFilter销毁.....");
    }
}

开发的时候的注意点:

  1. 过滤中的所有代码,在过滤特定的请求是都会执行
  2. 必须要让过滤器通行
    chain.doFilter(request,response)

在web.xml中配置过滤器

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>com.gs.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <!--只要是 /servlet的任何请求,会经过这个过滤器 -->
    <url-pattern>/servlet/*</url-pattern>
</filter-mapping>

下面我们通过一个带有中文字符的网页对上面的过滤器进行解析
[1] 编写ShowServlet类,这里只是简单的在网页上输出 你好,世界!

package com.gs.servlet;

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

public class ShowServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //resp.setCharacterEncoding("utf-8");
        resp.getWriter().write("你好,世界!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在web.xml中注册servlet
为了验证效果,我们把loginServlet设置了两个映射路径一个是/servlet/show,一个是 /show

<servlet>
   <servlet-name>showServlet</servlet-name>
   <servlet-class>com.gs.servlet.ShowServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>showServlet</servlet-name>
   <url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>showServlet</servlet-name>
   <url-pattern>/servlet/show</url-pattern>
</servlet-mapping>

[4] 编写过滤器,和我们上面所编写的例子(实现中文编码转化的方法)一致,这里我们处理的是/servlet/* 下的所有文件,那么当我们使用/show 进行访问时,过滤器不会进行拦截,那么它就会出现中文乱码;而使用/servlet/login 进行访问时则会进行拦截,这样就不会出现中文乱码问题
当我们访问 localhost:8080/show时,这时由于没有经过过滤器,所以会产生中文乱码问题。
在这里插入图片描述
当我们访问 localhost:8080/servlet/show时,这时候,它会经过过滤器,所以它就可以正常显示中文字符。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值