Filter

Filter功能

  1. 用来拦截传入请求和传出响应
  2. 修改或以某种方式处理服务端和客户端之间交换的数据流
  3. 统一处理中文乱码
  4. 屏蔽敏感词
  5. 控制资源的访问权限

Filter生命周期

打不过tomcat启动时,通过反射机制调用filter的无参构造函数创建实例化对象,同时调用init方法实现初始化,doFilter方法会调用多次,当tomcat关闭时,调用destroy方法,销毁filter对象

  • 无惨构造函数:只调用一次,当tomcat启动时调用
  • init方法:只调用一次,当filter的实例化对象创建完成后调用
  • doFilter:调用多次,访问Filter的业务逻辑都卸载Filter中
  • destory:只调用一次,Tomcat关闭时调用

执行顺序

当同时配置多个Filter时,filter的执行顺序由web.xml的顺序决定,此时注解形式无法决定filter的执行顺序

如何使用Filter处理中文乱码

与Servlet类似,Filter是javaWeb提供的一个接口,开发者只需要自定义一个类并且实现该接口即可
代码:

package Filter;

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

@WebFilter("/login123")
public class CharacterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

其继承的是Servlet中的filter,不要选错了
在这里插入图片描述

而且这个filter有两个默认方法,可以不用实现(java1.8以后的特性)
在这里插入图片描述
这个filter是针对字符集乱码的问题,以往我们需要在request中设置编码格式
而当页面很多时,每个都要写就很低效
所以就可以把这个设置编码格式的工作交给filter
前端代码如下
在这里插入图片描述

如果我们写中文传递过去
在这里插入图片描述
后端这里会输出乱码
在这里插入图片描述
所以需要filter来进行编码过滤
其中filter是自带请求中断功能,所以必须设置

filterChain.doFilter(servletRequest,servletResponse);

这个语句方便请求响应继续传递

以上是基于注解的形式
如果想在配置文件里面配置,则可以用

<filter>
    <filter-name>character</filter-name>
    <filter-class>Filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>character</filter-name>
    <url-pattern>/login</url-pattern>
</filter-mapping>

其中url就是你想要截获的地址,如果有多个地址需要截获,多写几行即可

如何使用Filter处理敏感词

前端jsp如下
在这里插入图片描述
其提交后跳转到映射成 /word 的servlet中
在这里插入图片描述
过滤器对 /word 进行拦截
在这里插入图片描述

package Filter;

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

@WebFilter("/word")
public class WorldFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        String name = servletRequest.getParameter("name");
        name = name.replace("敏感词","****");
        servletRequest.setAttribute("name",name);
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

Filter控制资源访问权限

对于某些需要权限的地方,比如说想下载,但必须是会员,那么我们就可以使用Filter来过滤,看是否有对应的权限
核心思路:
请求访问download页面时,Filter文件检查是否已经登录,,比如用户数据存储在session中,Filter就检查session是否存在用户,存在就放行,让请求继续访问download页面,不存在用户则跳转到login页面

下载页面

普普通通的下载页面,访问地址是/download.jsp

<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="/">资源1</a>
    <a href="/">资源2</a>
    <a href="/">资源3</a>
</body>
</html>

过滤器

拦截访问/download.jsp的请求,并且判断是否登录用户,登录则放行,没有则跳转到登录页面

package Filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/download.jsp")
public class ConfirmFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;//用子类继承父类对象,用于获取session
        HttpServletResponse response = (HttpServletResponse) servletResponse;//用于跳转页面
        HttpSession session = request.getSession();//获取session,用于检查是否存在用户(用户是否登录)
        String name = (String) session.getAttribute("name");
        if(name!=null){
            //已经有用户登录,则放行
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            //不存在用户,则跳转到登录界面
            response.sendRedirect("/test.jsp");
        }
    }
}

登录页面和审核页面

映射地址为/tesst.jsp用于引导用户输入账号密码

<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/login123" method="post">
        <input type="text" name="name">
        <input type="password" name="password">
        <input type="submit" value="提交">
    </form>
</body>
</html>

servlet页面用于验证登录信息,如果确认则跳转到下载页面,并且用户信息存入sess
不是则继续登录

package 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 ConfirmServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        String password = req.getParameter("password");
        if(name.equals("admin") && password.equals("password")){
            resp.sendRedirect("/download.jsp");
        }else {
            resp.sendRedirect("/test.jsp");
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值