Filter过滤器

3 篇文章 0 订阅
2 篇文章 0 订阅

Filter过滤器

过滤器,我们可以联想下生活中的净水器、空气净化器
web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能;一般用于完成通用的操作。如:统一编码处理、敏感字符过滤,权限登录…

执行流程

1、客户端发出请求,只有通过了过滤器才能进入servlet层

2、如果有多个过滤器要按照web.xml中注册的映射的顺序执行,只要其中有一个没有通过,客户端的请求就不会到servelet层
在这里插入图片描述

Filter开发步骤:

1、导包(继承Filter的接口)

public class CharacterEncodingFilter implements Filter

在这里插入图片描述
2、编写过滤器(实现Filter接口,重写doFilter的方法)

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

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

    }

    @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");
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }
}

chain.doFilter(request,response);
这代码是让我们的请求继续走,如果不写的话,程序到这里就被拦截停止了。至于为什么这个代码可以让程序循环的运行,我们按Ctrl 点击进入 FilterChain 的源码就都明了。(其实就是doFilter方法的循环调用)

在这里插入图片描述

在web.xml中配置 Filter

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

拦截路径

/index.jsp:只有访问index.jsp时,过滤器才会执行。
/jsp/*:访问jsp下的所有资源时,过滤器就会被执行。
/*.do:访问所有后缀名为do的资源时,过滤器都会被执行。
/*:访问所有资源时,过滤器都会被执行。

Filter示例

LogFilter.class
登录拦截器

package com.zcm.filter;

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

public class LogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        if (req.getSession().getAttribute("username")==null){
            resp.sendRedirect("error.jsp");
        }
        chain.doFilter(request,response);

    }

    @Override
    public void destroy() {

    }
}

HelloFilter.class
字符拦截器,将所有的请求和响应都转为中文

package com.zcm.filter;

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

public class HelloFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter 初始化");
    }

    @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;charest=UTF-8");
//        request.setCharacterEncoding("gbk");
//        response.setCharacterEncoding("gbk");
        System.out.println("Filter 执行前");
        chain.doFilter(request,response);
        System.out.println("Filter 执行后");
    }

    @Override
    public void destroy() {
        System.out.println("Filter 销毁");
    }
}

servlet的request.class
当username="admin"和password="123456"时进入success.jsp

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 request extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if (username.equals("admin") && password.equals("123456")){
            req.getSession().setAttribute("username",username);
            req.getSession().setAttribute("password",password);
            resp.sendRedirect("success.jsp");
        }else {
            resp.sendRedirect("error.jsp");
        }
    }

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

xml 部署拦截器

	<filter>
        <filter-name>requestfilter</filter-name>
        <filter-class>com.zcm.filter.HelloFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>requestfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>LogFilter</filter-name>
        <filter-class>com.zcm.filter.LogFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LogFilter</filter-name>
        <url-pattern>/success.jsp</url-pattern>
    </filter-mapping>

在这里插入图片描述
只有登录成功时进入success.jsp,如果直接访问success.jsp 就会被拦截,重定向到error.jsp页面上

index.jsp

<html>
<body>
<h2>Hello World!</h2>
<hr>
<form action="${pageContext.request.contextPath}/hello" method="post">
    username:<input type="text" name="username" placeholder="username">
    password:<input type="password" name="password" >
    <input type="submit" value="request">
</form>
</body>
</html>

error.jsp

ntentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Error</h1>
<a href="index.jsp">Back</a>
</body>
</html>

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Success</h1>
<a href="${pageContext.request.contextPath}/logout">注销</a>
</body>
</html>
<%@ page co

大家可以自己试一试哈
有什么疑问可以写在评论区

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值