JavaWeb之Filter快速入门(十七)

Filter

1. 过滤器简介

1. 过滤器是Java Web三大组件之一,它在很多方面都与Servlet相似
2. 过滤器可以理解成拦截器,其实过滤器的代码是环绕在被访问资源的前后,为被访问的资源提供增强的作用(比如过滤器就像楼层中保安,所有人员经过楼层必须经过保安)
3. 过滤器的应用场景:
	1). 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作
	2). 通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用
	3). 在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理

2. 过滤器编写步骤

1. 编写一个类实现javax.servlet.Filter接口。在doFilter方法中编写过滤代码
2. 在web.xml中配置哪些资源要经过该过滤器
	<filter>
		<filter-name>命名</filter-name>
		<filter-class>包名.类名</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>命名</filter-name>
		<url-pattern>拦截的资源</url-pattern>
	</filter-mapping>

一个目标资源可以指定多个过滤器,过滤器的执行顺序是在web.xml文件中的</filter-mapping>部署顺序

3. 过滤器的执行过程和生命周期

1、过滤器是在应用启动时就完成了实例化和初始化
2、对于过滤范围内资源的每次访问都会调用doFilter
3、应用被卸载时会调用destory方法

4. FilterConfig&FilterChain

ServletConfig
	ServletContext getServletContext():获取ServletContext的方法;
?	String getFilterName():获取Filter的配置名称;与<filter-name>元素对应;
?	String getInitParameter(String name):获取Filter的初始化配置,与<init-param>元素对应;
?	Enumeration getInitParameterNames():获取所有初始化参数的名称
FilterChain
	doFilter()方法的参数中有一个类型为FilterChain的参数,它只有一个方法:doFilter(ServletRequest,ServletResponse)
区别:
	1.个数不同
		Filter接口doFilter是3个参数:			ServletRequest,ServletResponse,FilterChain
		FilterChian的doFilter是2个参数:			ServletRequest,ServletResponse
	2.作用不同
		Filter接口doFilter拦截作用
		FilterChian中doFilter起放行作用

5. 过滤器其他配置

过滤四个类型:REQUEST FORWARD INCLUDE  ERROR
<filter-mapping>
    <filter-name>Filter06_Typetest</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>	<!-- 默认REQUEST,如果配置了其他类型,默认的就没有了 -->
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

6. 巩固包装设计模式

1、装饰模式口诀
	a、定义一个类实现与被包装类相同的接口
	b、定义一个变量记住被包装类对象的引用
	c、定义构造方法,传入被包装类对象的实例
	d、对于要改写的方法,改写即可
	e、对于不需要改写的方法,调用被包装对象的对应方法
2、装饰模式变化
	改写的方法所在的类,本身就是个包装类
	a、定义一个类,继承要包装的类
	b、定义一个变量,记住被包装类的引用
	c、定义构造方法,传入被包装类的实例
	d、覆盖要改写的方法

过滤器的案例

1. 过滤器简单案例(编码/静态和动态缓存控制)

1. 过滤器中实现设置编码
	强转request和response
	强转request和response、初始化容器时赋值config属性
	String encoding = config.getInitParameter("encoding");
	request.setCharacterEncoding(encoding);
	response.setContentType("text/html;charset="+encoding);
	chain.doFilter(request, response);

2. 全站动态资源无缓存
	强转request和response
	response.setHeader("Expires", "0");
	response.setHeader("Cache-Control", "no-cache");
	response.setHeader("pragma", "no-cache");
	chain.doFilter(request, response);

3. 静态资源设置缓存时间
	强转request和response
	String uri = request.getRequestURI();
	String extendsionName = uri.substring(uri.lastIndexOf(".")+1);

	String time = "0";
	time = config.getInitParameter(extendsionName);
	request.setCharacterEncoding("UTF-8");
	response.setContentType("text/html;charset=UTF-8");

	if(time != null) {
		response.setDateHeader("Expires", System.currentTimeMillis()+Integer.parseInt(time)*60*60*1000);
	}

	chain.doFilter(request, response);

最后勿忘配置web.xml文件

2. 用户自动登录

用户自动登录案例
1. 新建数据库中的表和对应的JavaBean对象
	create database day19;
	use day19;
	create table user(
		id int primary key,
		username varchar(100) not null unique,
		password varchar(100) not null
	);

	private int id;
	private String username;
	private String password;
2. 数据访问层UserDaoImpl类
	void save(User user)
	User find(String username, String password)
3. 工具类
	引入DBUtils/C3P0Util/EncodingUtil工具类
4. 业务逻辑层BusinessServiceImpl类
	public void register(User user)
	public User findUser(String username, String password)
5. LoginServlet类
	过滤器解决乱码问题
	5.1 获取请求参数
	5.2 调用业务逻辑判断是否登录成功
	5.3 将用户名和密码设置在cookie信息中Cookie c = new Cookie("loginInfo",loginInfo);
	5.4 判断用户选择的方式,设置相应的有效期
	5.5 设置cookie路径
	5.6 将cookie添加到响应头中
	5.7 重定向到首页

6. LogoutServlet类
	6.1 移除session域中的user
	6.2 新建空的cookie信息,设置cookie的有效期为过期0,设置cookie路径,添加到response头信息中
	6.3 重定向到首页

7. 过滤器类,处理编码
	7.1 获取初始化的参数
	7.2 设置编码之后再放行

8. 自动登录过滤器类AutoLoginFilter
	8.1 强制request,response
	8.2 获取请求的uri信息
	8.3 如果请求的参数不是以login.jsp登录
	8.4 获取session域中的user
	8.5 如果user为空
	8.6 获取请求的cookie信息
	8.7 如果获取的cookie为空重定向登录页面
	8.8 遍历所有cookie,如果为是用户的cookie就赋值为新cookie,break;
	8.9 如果赋值的新cookie不为空,获取cookie中的值
	8.10 切割value获取username和password中的值
	8.11 解码用户名,调用业务逻辑层方法判断用户名和密码
	8.12 如果获得的用户名不为空,将用户设置到session域中
	8.13 chain放行

页面设计
	1. login.jsp	用户登录页面提供选择有效期,提交到LoginServlet类
	2. top.jsp		头部,如果session域中的用户为空,提示登录,如果不为空,提示欢迎界面,提供注销功能
	3. index.jsp	引入top.jsp,提供帖子链接
	4. 1.jsp 		帖子链接

3. 过滤器拓展案例(全站编码/敏感词汇/html标签过滤)

1. 全站编码问题
	1). 强转request/response
	2). 设置编码为了解决post编码问题
	3). 若解决get提交编码问题,在doFilter放行之前包装一下request对象
	4). 定义MyHttpServletRequest继承HttpServletRequestWrapper
	5). 重写getParameter方法
		super.getParameter(name);接收用户请求的的参数的值
		如果为空直接返回null
		判断请求的方式super.getMethod(),如果get请求,将请求的值编码再解码

2. 敏感词汇过滤
	1). 强转request/response
	2). 在doFilter放行之前包装一下request对象
	3). 定义MyHttpServletRequest继承HttpServletRequestWrapper
	4). 定义词库词汇
	5). 获取请求参数的值,如果为空,直接返回空
	6). 遍历词库,替换请求参数的值
	7). 最后返回请求参数的值

3. HTML标签过滤
	1). 强转request/response
	2). 在doFilter放行之前包装一下request对象
	3). 定义MyHtmlServletRequest继承HttpServletRequestWrapper
	4). 调用filter方法替换请求参数的值
	5). filter方法在tomcat\webapps\examples\WEB-INF\classes\util\HTMLFilter.java

4. 全站压缩

1. 建立GZIP压缩过滤类GzipFilter
2. 在放行之前改写response,然后把改写之后的response传给doFilter
3. 针对HttpServletResponseWrapper,改写类为MyHttpServletResponse,重写其中的getOutputStream和getWriter方法
	3.1 定义临时容器
	3.2 定义获取临时容器的数据getBufferByte()
6. 针对临时容器,实现HttpServletResponseWrapper,提供write方法将数据写到临时容器中
时间: 2024-10-22 07:53:12

JavaWeb之Filter快速入门(十七)的相关文章

JavaWeb之Mysql快速入门(十一)

MySql快速入门 1. mysql简介 Structured Query Language 结构化查询语言 SQL标准,由ANSI(美国标准学会,属于ISO的核心成员)进行管理和维护的. 数据库厂商都支持该标准,并进行了扩展.扩展的部分,一般称之为方言. SQL标准和方言:普通话和方言 作用:与数据库进行交互 常用数据库:Oracle/DB2/MySQL/SQL Server 2. SQL语句的分类 DDL:Data Definition Language数据定义语言 alert/create

JavaWeb之Ajax快速入门(十九)

AJAX 1. AJAX简介 1. AJax是什么 允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做AJax,AJax不是新的编程语言是多种技术的结合形成一门新技术 AJAX = DHTML (HTML.CSS.JavaScript ) + XMLHttpRequest对象 2. AJax的特点 不适用于任何应用场景 导致逻辑处理混乱 Ajax是实现B\S模式下的异步交互 在实现同样的功能时,Ajax的性能更好 3. AJax的优点 1). 传统web交互模型,浏览器直接将请求发送给服务器

JAVAWEB开发之Struts2详解(一)——Struts2框架介绍与快速入门、流程分析与工具配置以及Struts2的配置以及Action和Result的详细使用

Struts2框架介绍 三大框架:是企业主流JavaEE开发的一套架构.Struts2 + Spring + Hibernate 什么是框架?为什么要学习框架? 框架是实现部分功能的代码(半成品),使用框架简化企业级软件开发. Struts2与MVC? Struts是一款优秀的MVC框架 MVC:是一种思想,是一种模式,将软件分为Model模型.View视图.Controller控制器 JAVAEE软件三层架构:web层(表现层).业务逻辑层.数据持久层(Sun提供javaEE开发规范) Jav

Python3快速入门(十七)——Python扩展模块开发

Python3快速入门(十七)--Python扩展模块开发 一.Python扩展模块 1.Python扩展模块简介 Python与C/C++交互的方案有多种,如Python C API,SWIG,SIP,ctypes,cpython,cffi,boost.python等.Python只是一个语言规范,有很多具体实现,CPython是标准Python,由C编写,Python脚本被编译成CPython字节码,然后由虚拟机解释执行,垃圾回收使用引用计数,Python与C/C++混合编程本质是基于CPy

javaweb之Filter详解

一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 二.Filter简介Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filte

javaweb-html快速入门

本文主要是进行HTML简单介绍(详细的属性查帮助文档就行了,这里主要为快速入门,赶时间,在最短的时间中看明白一个html文件的代码(如果能称之为代码的话)详细的样式表,布局啥的有时间再研究吧) HTML 1.html的简介 1.1,html的全称:HyperText Mark-up Language ,超文本标记型语言,是网页的语言. 超文本:比文本更加强大(后面还会讲到XML,可扩展标记性语言) 标记:就是标签,html所有操作都是通过标签直接或间接的操作(把需要操作的数据通过标签封装起来)

定时器(Quartz)快速入门

Quartz概述 Quartz中的触发器 Quartz中提供了两种触发器,分别是CronTrigger和SimpleTrigger. SimpleTrigger 每 隔若干毫秒来触发纳入进度的任务.因此,对于夏令时来说,根本不需要做任何特殊的处理来"保持进度".它只是简单地保持每隔若干毫秒来触发一次,无论你的 SimpleTrigger每隔10秒触发一次还是每隔15分钟触发一次,还是每隔24小时触发一次. CronTrigger 在特定"格林日历"时刻触发纳入进程的

MyBatis学习总结(一)——MyBatis快速入门

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 二.mybatis快速入门 2.1.准备开发环境 1.创建测试项目,普通java项目或者是JavaWeb项目均可,如下图所示: 2.添加相应的jar包 [mybat

Spring MVC 教程,快速入门,深入分析

资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 六.springMVC-mvc.xml 配置文件片段讲解 七.spring mvc 如何访问到静态的文件,如j