Java过滤器能够对目标资源的请求和响应进行截取,过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来。当然,过滤器既可以拦截request,也可以拦截返回的response,一张图解释:

一、什么是Java过滤器

过滤器的本质就是一个实现了 Filter 接口的 Java 类


public class FilterDemo implements Filter {public void destroy() {System.out.println("--过滤器消失");}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)         throws ServletException, IOException {//放行代码chain.doFilter(req, resp);}public void init(FilterConfig config) throws ServletException {System.out.println("--过滤器初始化");}}

重写相关代码里面重点在doFilter中实现相关操作方法

二、过滤器的配置

(1)web.xml里面修改相关配置

<filter><filter-name>filterDemo</filter-name><filter-class>package com.web.filter.FilterDemo</filter-class>
</filter><filter-mapping><filter-name>filterDemo</filter-name><!-- 拦截路径 --><url-pattern>/*</url-pattern>
</filter-mapping>

filter说明:

<filter-name></filter-name> :指定filter名字

<filter-class></filter-class> :指定filter全类名(带包名)

filter-mapping说明:

<filter-name></filter-name> :这里的标签是为了与上面filter中的名字对应,从而指向到对应的文件中

<url-pattern></url-pattern>设置filter所拦截的路径 , 这里决定了什么样的资源会被过滤器拦截处理

格式 解释
/index.jsp 只有访问index.jsp这个资源的时候才会执行过滤器
/index/* 访问index下所有资源你的时候,执行过滤器
*.jsp 所有jsp格式的资源被访问的时候,执行过滤器
/* 任意资源被访问,均执行过滤器

过滤器内设置的是比较通用的一些设置,所以一般来说使用 /* 这种格式,不过也可以根据需求情况选择

拦截方式配置:dispatcher

拦截方式配置也就是资源被访问的形式,有这么几个属性

REQUEST:默认值,浏览器直接请求资源

FORWARD:转发访问资源 : RequestDispatcher.forward();

INCLUDE:包含访问资源 : RequestDispatcher.include();

ERROR:错误跳转资源 : 被声明式异常处理机制调用的时候

补充:声明式异常处理即:在web.xml中通过配置来确定不同的异常类型将如何被处理,最后跳转到哪个页面,也就是我们常常看到的一些404错误页面

<error-page><!--异常的类--><exception-type>xxx</exception-type><!--异常发生时跳转的页面--><location>xxx</location>
</error-page>

(2)使用注解配置

与servlet相似的配置 ,我们可以指定它的名字和拦截路径

@WebFilter("filterName="FilterDemo1",urlPatters="/*")

但是直接在类上声明注解,显然那我们是不需要指定其名字的,而通过查看源码又可以知道,urlPatters又可以被value指定,而value又可以省略,所以我们可以简写为

@WebFilter("/*")

若想在filter注解中配置dispatcher,我们需要设置dispatcherTypes属性

@WebFilter(value = "/*",dispatcherTypes ={DispatcherType.FORWARD,DispatcherType.FORWARD} )

前面都是基本概念,下面将以做过的项目中真实的用户登录案例的拦截器作为例子为大家讲解一下

首先第一个例子是用户登录的拦截器,先看web.xml中的配置:

<!-- 集成门户的过滤器,获取权限 --><filter><filter-name>gainFilter</filter-name><filter-class>com.demo.authen.filter.gainFilter</filter-class><!--初始化参数 相当于key和value可以在过filter中取初始化值--><init-param><description>描述:是否集成menhu</description><param-name>isIntegrated</param-name><param-value>true</param-value></init-param><init-param><param-name>extension</param-name><param-value>/**/**.js,/**/**.jpg,/**/**.css,/**/**.jpeg,/**/**.json,/**/**.gif,/**/**.png,/**/**.ico,/**/**.mp4</param-value></init-param></filter><!--匹配拦截的内容 /*则对所有的内容都进行拦截--><filter-mapping><filter-name>gainFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

我们指定com.demo.authen.filter.gainFilter这个类为我们的拦截器方法,设定一个初始化参数isIntegrated的值为true,当前端请求web服务的时候,会先经过我们的过滤器进行判断筛选,下面看看拦截器里面究竟是什么样的:


/*** 获取权限过滤器。<br/>* 用户第一次进入系统,那么会判断用户是否已经初始化了权限,<br/>* 如果没有那么会调用门户的服务,获取菜单和功能的权限。* * */
public class GainFilter implements Filter {/** 是否和门户集成 */public static boolean isIntegrated;/*** 初始化过滤器*/@Overridepublic void init(FilterConfig config) throws ServletException {//获取web.xml里面配置的初始化值String cfg = config.getInitParameter("isIntegrated");if ("true".equals(cfg)) {isIntegrated = true;}}/*** 过滤主体内容*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpSession session = httpRequest.getSession();if (isIntegrated) {// 如果门户集成String account = (String) session.getAttribute(ACCOUNT);userService = (UserService) SpringContextUtil.getBean("userService");String reqUri = httpRequest.getRequestURI();} else {// 不和门户集成,进行测试用String account = "admin";long cityCode = 330000;User user = new User();user.setAccount(account);session.setAttribute("account", user);session.setAttribute("cityCode", user.getCityCode());}//通过当前过滤器,进入下一个过滤器或者进入程序chain.doFilter(request, response);}/***过滤器消失**/@Overridepublic void destroy() {}
}

上面是截自真实项目的部分片段,我们的 GainFilter 会去实现Filter 这个接口,并且会重写三个方法,init、doFilter、destroy。inity一般都是一些初始化参数,比如上面的去获取isIntegrated在web.xml中配置的值。doFilter是我们过滤器的主体,我们可以在这里执行一系列的操作。

这里我们再举一个实例,就是我们设置拦截器允许跨域,这个例子会比较完整,还是先看web.xml的配置:

  <!--跨域问题过滤器  --><filter><filter-name>CORSFILTER</filter-name><filter-class>com.demo.authen.filter.CorsFilterConfig</filter-class></filter><filter-mapping><filter-name>CORSFILTER</filter-name><url-pattern>/*</url-pattern></filter-mapping>

下面再看看拦截器的代码:

package com.demo.authen.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import java.io.IOException;
@Configuration
@Order(value=0)
@WebFilter(filterName = "CorsFilterConfig", urlPatterns = "/*")
public class CorsFilterConfig implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("===============CorsFilterConfig=================");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {HttpServletResponse res = (HttpServletResponse) servletResponse;res.setHeader("Access-Control-Allow-Origin", "*");res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");res.setHeader("Access-Control-Max-Age", "1728000");res.setHeader("Access-Control-Allow-Headers","Authentication, Authorization, content-type, Accept, x-requested-with, Cache-Control");filterChain.doFilter(servletRequest, res);}@Overridepublic void destroy() {}}

在后台配置这个将允许跨域请求,方便前后端分离项目

Java过滤器详细解读以及使用实例讲解相关推荐

  1. HTTP代理如何正确处理Cookie(2) - 转载(写的比较详细,并以实例讲解)

    HTTP代理如何正确处理Cookie(2) - 转载(写的比较详细,并以实例讲解) http://hi.baidu.com/bdui/blog/item/de891ad90cb4b12f11df9ba ...

  2. Transformer详细解读与预测实例记录

    文章目录 Transformer详细解读与预测实例记录 1.位置编码 1)输入部分: 2)位置编码部分: 2.多头注意力机制 1)基本注意力机制 2)transformer中的注意力 3.残差和Lay ...

  3. 【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解...

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由E ...

  4. java spring hiberate_Spring+SpringMVC+Hibernate整合实例讲解

    使用Maven构建项目,用pom.xml引入相应jar,配置以下文件 创建spring.xml: xmlns="http://www.springframework.org/schema/b ...

  5. Java过滤器详细文档,简介,实例,应用

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

  6. java BASE64Encoder详细介绍及简单实例

    java  BASE64Encoder详解 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base6 ...

  7. java异常 子类_Java异常 Exception类及其子类(实例讲解)

    C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...

  8. java exception子类_Java异常 Exception类及其子类(实例讲解)

    C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...

  9. fusion 360安装程序的多个实例正在同时运行。_阿里架构师实例讲解——Java多线程编程;详细的不能再详细了...

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

最新文章

  1. 直线宽度2 points wide_OpenGL 绘图实例二之直线和圆弧的绘制
  2. linux 获取内核线程数,如何从命令行获取Linux中的CPU /内核数量?
  3. easyui分页查询为什么会有下拉框_做网站优化为什么要分析百度下拉词和相关搜索?...
  4. 小度智能音箱维修点_智能音箱哪个好?小度 小爱 天猫 评测
  5. 新版谷歌浏览器怎么查找和改变编码格式
  6. mysql的引双向链表_一分钟掌握MySQL的InnoDB引擎B+树索引
  7. MVC自学系列之四(MVC模型-Models)
  8. 开发跨平台应用解决方案-uniapp 真心不错,支持一波
  9. sybase 连接mysql_安装sybase服务器并连接数据库
  10. matlab构建公式模块,第五章 matlabsimlink下数学模型的建立.ppt
  11. Spark SQL 执行计划详解
  12. matlab中遗传算法代沟,谢菲尔德大学的MATLAB遗传算法
  13. stokes方程matlab,Navier-Stokes matlab 238万源代码下载- www.pudn.com
  14. Micro-personnel部署
  15. 我用Python爬取了李沧最近一年多的二手房成交数据得出以下结论
  16. 概率论与数理统计公式
  17. 关于Redis数据库
  18. 决定迭代次数的两种效应
  19. pandas合并文件夹下的excel文件
  20. 消费机 mysql_消费机软件主要构成

热门文章

  1. 文本聚类(二)—— KMeans 聚类
  2. mongoDB 定长集合(capped collection)
  3. 离散傅里叶变换 - 快速计算方法及C实现 - 第一篇
  4. 中国钛产业发展现状及投资风险分析报告2022-2028年
  5. 中国女式内衣市场销售态势分析与投资前景研究报告2022-2028年
  6. itoa函数 atoi函数
  7. Labelme配置、标注快捷键
  8. 【MATLAB教程案例96】基于GA优化的WSN最大覆盖率和最少节点部署数量matlab仿真
  9. mysql数据库 purge_MySQL数据库之Purge死锁问题解析
  10. java-字符串的遍历和字符串数组的遍历