过滤器Filter的使用

新建项目

1.在index.jsp中编写一个简单的界面,输入内容进行提交

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <form action="/test" method="post">
      <input type="text" name="value"/>
      <input type="submit" name="提交"/>
    </form>
  </body>
</html>

2.在src目录下新建包,在包里新建TestServlet类

package com.shunde.servlet;

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 java.io.IOException;

@WebServlet("/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //req.setCharacterEncoding("UTF-8");
        String value = (String) req.getParameter("value");
        System.out.println(value);
    }
}

3.编译运行
随意输入中文,点击提交
在这里插入图片描述
在这里插入图片描述
在IDEA中出现乱码
4.在TestServlet类中添加代码

req.setCharacterEncoding("UTF-8");

即可解决问题
5.新建login.jsp和LoginServlet类,写入相同的代码
同样会出现乱码问题,同样需要写入

req.setCharacterEncoding("UTF-8");

那么假设一个项目里有几百个这个的类呢?如果在每一个类里都写入req.setCharacterEncoding(“UTF-8”);这就会造成代码的重复。
这种情况下,就可以引入过滤器

过滤器

功能

1.用来拦截传入的请求和传出的响应
2.修改或以某种方式处理正在客户端和服务端之间交换的数据流

如何使用

与Servlet类似,Fliter是Java WEB提供的一个类,开发者只需要自定义一个类并实现该接口即可
1.以上面项目为基础
在src下新建一个包,包内新建一个类,在该类里实现Filter接口

package com.shunde.filter;

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

public class CharacterFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTE-8");
        //将该代码写入过滤器中,表示将客户端传来的数据设置为UTF-8格式
        filterChain.doFilter(servletRequest,servletResponse);
        //在上面设置客户端传来的数据时,相当于是将这条请求数据截断了,
        //在格式设置完毕之后,还需要将设置完毕之后的数据重新发往服务端
    }
}

2.在web.xml文件中进行关联
在其中加入以下代码

	<filter>
        <filter-name>character</filter-name>
        <filter-class>com.shunde.filter.CharacterFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>character</filter-name>
        <url-pattern>/test</url-pattern>
        //这里可以关联多个
        <url-pattern>/test1</url-pattern>
        <url-pattern>/test2</url-pattern>
        <url-pattern>/test3</url-pattern>
    </filter-mapping>

3.仔细观察
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
首先是通过"/test"将index.jsp文件和TestServlet类关联起来
之后又通过"/test"将CharacterFilter类关联起来
4.编译运行
在这里插入图片描述
这时候就通过Filter完成乱码处理的问题
5.当然也可以通过注解的方式进行关联
删除web.xml中添加的代码
在CharacterFilter类中添加注解

package com.shunde.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebFilter("/test")
//注解的方式关联
public class CharacterFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

Filter的生命周期

1.当Tomcat启动时,通过反射机制调用Filter的无参构造函数创建实例化对象,同时调用init方法实现初始化
2.doFilter方法是调用多次的,当Tomcat服务关闭时,调用destory来销毁Filter对象
四个方法:
(1)无参构造方法:只调用一次,当Tomcat启动时调用(Filter一定要配置)
(2)init方法:只调用一次,当Filter的实例化对象创建完成之后调用
(3)doFilter方法:调用多次,访问Filter的业务逻辑都写在Filter中
(4)destory方法:只调用一次,Tomcat关闭时调用

多个Filter的调用顺序

同时配置多个Filter,Filter的调用顺序是由web.xml中配置顺序来决定的,写在上面的配置先调用

实际开发中Filter的使用场景

1.统一处理中文乱码
2.屏蔽敏感词汇
3.控制资源的访问权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值