FIlter作用

过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。

当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。

其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。

FIlter实现步骤

1.创建AFilter类实现javax.servlet.Filter接口

2.添加@WebFilter("/*")注解或者添加web.xml配置

AFilter

com.yuan.web.filter.AFilter

AFilter

/*

3.已经完成了

4.@WebFilter参数说明

编写简单一个Filter

package com.yuan.web.filter;

import javax.servlet.*;

import javax.servlet.annotation.WebFilter;

import java.io.IOException;

@WebFilter("/*")

public class AFilter implements Filter {

/*** 初始化 创建后立即执行** @param filterConfig* @throws ServletException*/

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("AFilter出生啦");

}

/*** 每次过滤时都会执行** @param request* @param response* @param chain* @throws IOException* @throws ServletException*/

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

//访问时过滤 System.out.println("拦截!留下买路财");

//放行 chain.doFilter(request,response);

//响应时过滤 System.out.println("你又~回来啦?");

}

/*** 销毁前立即执行*/

@Override

public void destroy() {

System.out.println("AFilter去世啦");

}

}

FIlter说明Filter是单例的!

void init(FilterConfig)

创建之后,马上执行;Filter会在服务器启动时就创建!

FilterConfig-->与ServletConfig相似获取初始化参数:getInitParameter()

获取过滤器名称:getFilterName()

获取appliction:getServletContext()

void destory()

销毁之前执行!在服务器关闭时销毁

void doFilter(ServletRequest,ServletResponse,FilterChain)

每次过滤时都会执行

FilterChaindoFilter(ServletRequest, ServletResponse):放行!

执行目标资源就相当于调用了目标Servlet的service()方法!,或是执行下一个过滤器!如果没有下一个过滤器那么执行的是目标资源,如果有,那么就执行下一个过滤器!

多个过滤器执行顺序

1.的配置顺序决定了过滤器的执行顺序!

2.过滤时遵守先进先出

过滤器的N种拦截方式

REQUEST默认的!

FORWARD

INCLUDE

ERROR

@WebFilter(value = "/CServlet",

dispatcherTypes = {

DispatcherType.ASYNC,//异步 DispatcherType.ERROR,//错误 DispatcherType.FORWARD,//转发 DispatcherType.INCLUDE,//包含 DispatcherType.REQUEST})//请求public class AFilter implements Filter {}

应用场景

执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作

通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;

在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;

设置目标资源/:所有资源

/xx/xx/ :xx/xx/下的所有资源

/aaa/bbb/ccc/Servlet:具体AServlet

案例

案例一【分ip统计网站的访问次数】

分析

统计工作需要在所有资源之前都执行,那么就可以放到Filter中了。

我们这个过滤器不做拦截操作!因为我们只是用来做统计的。

用什么东西来装载统计的数据。Map

整个网站只需要一个Map即可!

Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中),Map保存到哪里!(Map保存到ServletContext中!!!)

Map需要在Filter中用来保存数据

Map需要在页面使用,打印Map中的数据

代码实现

Listener

package com.yuan.web.listener;

import javax.servlet.ServletContext;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

import javax.servlet.annotation.WebListener;

import java.util.HashMap;

import java.util.LinkedHashMap;

@WebListener()

public class CListener implements ServletContextListener {

@Override

public void contextInitialized(ServletContextEvent sce) {

//1.创建ServletContext ServletContext application = sce.getServletContext();

//2.Map HashMap ipMap = new LinkedHashMap<>();

//3.把Map保存到ServletContext中 application.setAttribute("ipMap",ipMap);

}

@Override

public void contextDestroyed(ServletContextEvent sce) {

}

}

Filter

package com.yuan.web.filter;

import javax.servlet.*;

import javax.servlet.annotation.WebFilter;

import java.io.IOException;

import java.util.LinkedHashMap;

/*** @author Yuan-9826*/

@WebFilter("/*")

public class CFilter implements Filter {

@Override

public void init(FilterConfig config) throws ServletException {

}

@Override

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

//1.得到ServletContext中的IPMap ServletContext application = req.getServletContext();

//2.获取客户端IP String IP = req.getRemoteAddr();

//3.获得并操作Map LinkedHashMap ipMap = (LinkedHashMap) application.getAttribute("ipMap");

if (ipMap.containsKey(IP)) {

int ipValue = ipMap.get(IP);

ipMap.put(IP, ++ipValue);

System.out.println("添加了map IP = " + IP + "次数 = " + ipValue);

} else {

ipMap.put(IP, 1);

System.out.println("添加了map IP = " + IP + "次数 = " + 1);

}

application.setAttribute("ipMap", ipMap);

//4.放行 chain.doFilter(req, resp);

}

@Override

public void destroy() {

}

}

jsp

显示IP

${applicationScope.ipMap }

IP地址 次数
${entry.key} ${entry.value}

效果

image.png

案例二【粗粒度权限过滤】

只有文字描述步骤

游客、会员、管理员三个粒度

1.创建一个Fileter,过滤会员下的资源访问,这是保安1号 ,doFilter里检查session中权限标记,第一道检查工序,不是管理员=> 放行,第二道检查工序,不是会员=> 打回到登录/注册页面,如果是会员就放行!

2.创建一个Fileter,过滤管理员下的资源访问,这是保安2号 ,doFilter里检查session中权限标记,查看是不是管理员,不是管理员=>打回到登录/注册页面,如果是管理员就放行!

案例三【解决全站字符乱码(POST和GET中文编码问题)】

工具类

package com.yuan.encoding;

import java.io.UnsupportedEncodingException;

/*** 编码转换*/

public class EncodeingUtils {

/*** iso-8859-1 转成 utf-8** @param code* @return*/

public static String i2u(String code) {

try {

return new String(code.getBytes("iso-8859-1"), "utf-8");

} catch (UnsupportedEncodingException e) {

new RuntimeException("转码失败");

return null;

}

}

/*** iso-8859-1 转成 gbk** @param code* @return*/

public static String i2g(String code) {

try {

return new String(code.getBytes("iso-8859-1"), "gbk");

} catch (UnsupportedEncodingException e) {

new RuntimeException("转码失败");

return null;

}

}

/*** gbk 转成 iso-8859-1** @param code* @return*/

public static String g2i(String code) {

try {

return new String(code.getBytes("gbk"), "iso-8859-1");

} catch (UnsupportedEncodingException e) {

new RuntimeException("转码失败");

return null;

}

}

/*** gbk 转成 utf-8** @param code* @return*/

public static String g2u(String code) {

try {

return new String(code.getBytes("gbk"), "utf-8");

} catch (UnsupportedEncodingException e) {

new RuntimeException("转码失败");

return null;

}

}

/*** utf-8 转成 iso-8859-1** @param code* @return*/

public static String u2i(String code) {

try {

return new String(code.getBytes("utf-8"), "iso-8859-1");

} catch (UnsupportedEncodingException e) {

new RuntimeException("转码失败");

return null;

}

}

/*** utf-8 转成 gbk** @param code* @return*/

public static String u2g(String code) {

try {

return new String(code.getBytes("utf-8"), "gbk");

} catch (UnsupportedEncodingException e) {

new RuntimeException("转码失败");

return null;

}

}

}

package com.yuan.web.filter;

import com.yuan.encoding.EncodeingUtils;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

/*** 被掉包了的Request*/

public class HttpRequest extends HttpServletRequestWrapper {

private HttpServletRequest request;

public HttpRequest(HttpServletRequest request) {

super(request);

this.request = request;

}

/*** 处理编码问题* @param name* @return*/

@Override

public String getParameter(String name) {

String value = request.getParameter(name);

return EncodeingUtils.i2u(value);

}

}

package com.yuan.web.filter;

import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;

import java.io.IOException;

/*** 乱码过滤器*/

public class EncodingFilter implements Filter {

private String GET = "GET";

private String POST = "POST";

private Integer version = 8;

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("编码过滤器执行");

final String version = filterConfig.getInitParameter("tomcatVersion");

this.version = Integer.valueOf(version);

System.out.println(version);

}

@Override

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

//处理post请求编码问题 req.setCharacterEncoding("utf-8");

/*** tomcat8之后自己做了get请求的处理*/

if (version < 8) {

System.out.println("Tomcat版本低于8 做GET请求处理");

//掉包request 和 HttpServletRequest HttpServletRequest request = (HttpServletRequest) req;

//放行时 if (GET.equals(request.getMethod())) {

HttpRequest hr = new HttpRequest(request);

chain.doFilter(hr, res);

} else if (POST.equals(request.getMethod())) {

chain.doFilter(req, res);

}

}else {

chain.doFilter(req, res);

System.out.println("Tomcat版本不低于8 不做GET请求处理");

}

}

@Override

public void destroy() {

}

}

只要配置了这个过滤器 即可使用

encoding

com.yuan.web.filter.EncodingFilter

tomcatVersion

8

encoding

/*

案例四【页面静态化 改日补充】

java filter过滤器_JavaWeb之 Filter(过滤器)相关推荐

  1. filter过滤器_JavaWeb之 Filter(过滤器)

    FIlter作用 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如 ...

  2. java+filter加密_Javaweb之Filter案例练习-自动登录问题和MD5加密

    自动登录问题和MD5加密 前面已经完成了Filter的自动登录,但是有问题,我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截.这肯定不合适 ...

  3. java web三大组件之filter过滤器

    过滤器是java web中相当重要的组成成分,是JavaWeb三大组件之一,它与Servlet很相似.不过过滤器有以下三条特性: 过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servle ...

  4. java filter教程_Java Web Filter 过滤器学习教程(推荐)

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  5. Java学习路线-49:Servlet过滤器Filter

    课时1 过滤器的入门 JavaWeb三大组件 1.都需要在web.xml中进行配置 Servlet Filter Listener 2.过滤器 会在一组资源(jsp, servlet, css, ht ...

  6. Java Servlet 实战入门教程-10-servlet 过滤器 Filter

    过滤器 概念 Filter(过滤器)是 Java 组件,允许运行过程中改变进入资源的请求和资源返回的响应中的有效负载和头信息. Java Servlet API 类和方法提供了一种轻量级的框架用于过滤 ...

  7. javaweb过滤器_JavaWeb技术(2):SpringMVC中的Filter

    Filter顾名思义就是过滤器,在JavaWeb体系中,他在服务端,卡在请求/响应与Servlet之间做一些操作: 过滤器相关的类的顶层接口如下,以下方法都由Web容器自动调用: package 你可 ...

  8. java过滤器filter过滤某个包_Java过滤器Filter使用详解

    过滤器 过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改.判断等,把不符合规则的请求在中途拦截或修改.也可以对响应进行过滤,拦截或修改响应. 如 ...

  9. 布隆过滤器(Bloom Filter)- 原理、实现和推导

    目录 算法背景 布隆过滤器–概念 布隆过滤器-原理 布隆过滤器-缺点 布隆过滤器-实现 布隆过滤器-应用 布隆过滤器-公式推导 算法背景 问题: 在开发中,经常要判断一个元素是否在一个集合中. 实现方 ...

最新文章

  1. jupyter notebook配置
  2. 2.34模型--简单字符串查找(占位).c
  3. Scrapy研究和探索(七)——如何防止被ban大集合策略
  4. 安装系统提示选中的磁盘具有MBR分区表
  5. 股票实时行情数据大全
  6. 为什么 C+标准每三年发布一次?
  7. python获取字典的值_Python:如何从pandas系列中获取字典中的值
  8. 第七章 PX4-Pixhawk-Mavlink解析
  9. 计算机四级信息安全题,2014年计算机四级考试信息安全工程精选真题
  10. 在c++中一个空类占用的字节数
  11. C++11 并发指南四(future 详解一 std::promise 介绍)
  12. dj电商-项目开发流程
  13. 浅谈算法(简单算法)
  14. AcWing 874. 筛法求欧拉函数(欧拉函数)
  15. Vue入门之常用指令
  16. 《Windows内核原理与实现笔记》(一)Windows系统结构和基本概念
  17. mongodb分组查询 php,MongoVUE下实现MongoDB的Group分组查询
  18. Word如何快速绘制你需要的作文稿纸
  19. mtk2503 如何支持使用epo?
  20. dijikstra 旅行商问题_车辆路径问题与算法

热门文章

  1. 程序员的算法课(10)-字符串排序算法实例(纯代码)
  2. 用JAVA制作小游戏——推箱子(一)
  3. SAP CRM系统订单模型的设计与实现 1
  4. 中本聪愿景大会(SVC):BCH最贴近中本聪白皮书
  5. 对一个“算法”的分析
  6. 揭开 Facebook Growth Hacking 的神秘面纱,微信、人人为何都在效仿?
  7. Ubuntu下GTK的安装、编译和测试
  8. 借伞,取经,停车,合作.
  9. 学习结构[记录]类型(7) - 结构也可以有构造函数
  10. Swing编程基础 之三