JavaWeb基础—过滤器Filter
一、概念
JavaWeb三大组件之一(组件都有一个特性,需要在web.xml中配置)
过滤器:会在一组资源(jsp servlet等)的前面执行,可以让请求得到目标资源,也可以终止请求,不再继续
也就是过滤器拥有拦截请求的能力
与sevlet的拦截自身的单个资源不同,过滤器可以拦截一组资源(单个房间与一座大楼)
二、如何编写Filter
过滤器如何编写:
写一个类,实现Filter接口(当然Myeclipse支持直接NEW 一个Filter)
在web.xml中进行配置
Filter接口三个方法(生命周期) 是单例的
init() 创建之后马上执行(会在服务器启动时就创建)
destory() 销毁之前执行(服务器关闭时销毁)
doFilter() 执行过滤操作(注意三个参数)
web.xml中配置
和servlet非常类似
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name></filter-name>
<url-pattern>/*</url-parrent> (使用/*偏多)
</filter-mapping>
FilterConfig ->类似 ServletConfig 能获取初始化参数
获取Applicatio(最有用的方法)
FilterChain
doFilter()方法 (与上面的区分,这个类是上面的一个参数)
功能:放行(相当于调用了目标Servlet的service()方法,执行完了还得回来)
==============================================
多过滤器的优先顺序:
大的先运行,小的后运行
例:先/* 后/AServlet
先执行图书馆的门禁,再执行各自习室的门禁,出来时放行当然相反
如何控制执行顺序:
在filter-mapping的配置顺序决定了过滤器的执行顺序
==============================================
四种拦截方式:
1.拦请求 REQUEST
2.拦转发 FORWARD
3.拦包含 INCLUDE
4.拦错误 ERROR
在filter-mapping中配置 <dispatcher>REQUEST</dispatcher> 默认为此种方式
==============================================
应用场景:
1.执行目标资源之前做一些预处理工作,例如编码的设置,这种操作通常是放行的。(发传单的,不拦截)
2.通过条件判断是否放行。(保安,可拦截),如拦截IP地址
3.目标资源执行后,做一些特殊的处理工作。如把目标资源输出数据进行处理。
=============================================
五个小案例(day21):
1.分IP统计网站访问次数(只统计,不拦截,在所有资源之前执行,放到过滤器,参考应用场景1)
使用map装载数据(key是IP value是次数(Integer))
map保存到ServletContext中(因为它既不属于某个请求,也不属于某个session)
需要在服务器开启的时候创建,使用ServletContextListener监听器初始化时创建
2.粗粒度权限控制(游客,管理员,会员等)
不同文件(不同角色的jsp等)放不同文件夹中,每个文件夹派一个Filter把守
3.解决全站字符乱码问题(两种请求都要处理)
POST:request.setCharacterEncoding("utf-8");
GET:拿到字符串再重新编码
增强request(继承HttpServletRequestWrapper),装饰者模式的是你还有你,一切拜托你
response类同
4.页面静态化
(针对的是长期不更改的,不会轻易地发生变化)
首次访问去数据库访问数据,把数据保存到一个HTML中
二次访问时直接显示HTML内容
三、给出几个实例
统计IP
package cn.itcast.web.filter; import java.io.IOException;
import java.util.Map; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter; /**
* 分IP统计访问次数
*/
@WebFilter("/*")
public class AFilter implements Filter {
private FilterConfig config;//将Init()中的config保存起来 public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//得到application中的map,如果存在IP,次数增加,不存在则创建此IP,次数初识为1
ServletContext sc = config.getServletContext();
//得到map
Map<String,Integer> map = (Map<String, Integer>) sc.getAttribute("map");
//获取IP地址
String ip = request.getRemoteAddr();
//进行判断
if(map.containsKey(ip)){//不是第一次访问
int count = map.get(ip);
map.put(ip, count+1);
}else{//首次访问
map.put(ip,1);
}
//最后再放进去
sc.setAttribute("map", map);
//必须要放行
chain.doFilter(request, response);
} public void init(FilterConfig fConfig) throws ServletException {
this.config = fConfig;
} }
处理全站乱码
package cn.itcast.web.filter; import java.io.IOException;
import java.util.Map; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter; /**
* 分IP统计访问次数
*/
@WebFilter("/*")
public class AFilter implements Filter {
private FilterConfig config;//将Init()中的config保存起来 public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//得到application中的map,如果存在IP,次数增加,不存在则创建此IP,次数初识为1
ServletContext sc = config.getServletContext();
//得到map
Map<String,Integer> map = (Map<String, Integer>) sc.getAttribute("map");
//获取IP地址
String ip = request.getRemoteAddr();
//进行判断
if(map.containsKey(ip)){//不是第一次访问
int count = map.get(ip);
map.put(ip, count+1);
}else{//首次访问
map.put(ip,1);
}
//最后再放进去
sc.setAttribute("map", map);
//必须要放行
chain.doFilter(request, response);
} public void init(FilterConfig fConfig) throws ServletException {
this.config = fConfig;
} }
request的装饰类
(装饰者模式(Decorator)的核心总结是经典的 是你还有你,一切拜托你)
具体的步骤如下:
1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类。
2.在类中定义一个变量,变量类型即需增强对象的类型。
3.在类中定义一个构造函数,接收需增强的对象。
4.覆盖需增强的方法,编写增强的代码。
一个简单的例子见下:
package cn.itcast.web.filter; import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map; import javax.servlet.AsyncContext;
import javax.servlet.DispatcherType;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part; /**
* 自己写的request的装饰类
* 实际上java已经帮我们处理了那一大堆为实现的一切拜托你
* @author jiangbei01
*
*/
public class EncodingRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
public EncodingRequest(HttpServletRequest request) {
super(request);
this.request = request;//存一个底层对象
} @Override
public String getParameter(String name) {
String value = request.getParameter(name);
//处理value的编码问题
try {
value = new String(value.getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return value;
} }
JavaWeb基础—过滤器Filter的更多相关文章
- Javaweb基础--->过滤器filter(转发)
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- JavaWeb中过滤器Filter的使用示例
https://github.com/YouXianMing/Java-Web-Study/tree/master/Servlet-Filter 过滤器示例基于以下流程 测试效果如下 web.xml配 ...
- JavaWeb基础-过滤器监听器
过滤器 1定义:过滤器是一个服务器的组件,他可以截取用户端的请求与响应信息,并对这些信息进行过滤;过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 2过滤器的工作原理: 3过滤器 ...
- JavaWeb的过滤器Filter
Filter的作用是在请求到达web资源(HTML.css.Servlet.Jsp)之前拦截,做一个预处理. 创建一个类实现Filter接口,在web.xml中对文件进行配置 <filter&g ...
- vue基础----过滤器filter
1.用的场景:一个功能在每个组件都能用,而computed虽然有缓存,但不能用在每一个组件,需要的话的每一个都需要写. 2.特点:改变数据的展示形式,不改变原有的形式 分为全局与局部的 <di ...
- JavaWeb中过滤器Filter的url-pattern设置
源码 https://github.com/YouXianMing/Java-Web-Study/tree/master/Servlet-Filter-UrlPattern Filter顺序以及url ...
- Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)
javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置. ①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Jav ...
- JavaWeb学习笔记(二十二)—— 过滤器filter
一.什么是过滤器 过滤器filter是JavaWeb三大组件之一,它与Servlet很相似!不过过滤器是用来拦截请求的,而不是处理请求的.WEB开发人员通过Filter技术,对web服务器管理的所有w ...
- ⑧javaWeb之在例子中学习(过滤器Filter)
前言 本系列 Servlet & JSP 学习系列[传送门]逐渐到了中期了,希望大家喜欢我写的,总结的点点滴滴- 今天我们来讲讲过滤器 你们的支持是我写博客的动力哦. 最近买了两本书,觉得大二 ...
随机推荐
- 手动搭建 redis 集群
转自http://meia.fun/article/1544161420745 手动搭建 redis 集群 redis 基本命令: 启动 redis 服务:redis-server xxx.conf ...
- 3.如何在Maven项目中引入自己的jar包
1.一般情况下jar包都可以使用pom.xml来配置管理,但也有一些时候,我们项目中使用了一个内部jar文件,但是这个文件我们又没有开放到maven库中. 我们会将文件放到我们项目中.(以下以java ...
- mysql group replication观点及实践
一:个人看法 Mysql Group Replication 随着5.7发布3年了.作为技术爱好者.mgr 是继 oracle database rac 之后. 又一个“真正” 的群集,怎么做到“ ...
- eclipse中如何添加tomcat插件
本篇简短的介绍了如何安装tomcat插件,因为不eclipse中不安装插件就没有tomcat图标,也就无法正常关闭服务器而只能terminate.废话不多说,直接进入主题: 1.首先下载一个tomca ...
- 关于打开现有项目时数据库连接配置遇到的问题 连接字符串中的数据源值指定未安装的SQL Server的实例。要解决此问题,可选择安装匹配的SQL Server实例或修改连接字符串中的数据源值
最近在看红皮书<ASP.NET MVC 5 高级编程>时,为了更好理解,边看书,边打开源代码查看,在VS(Visual Studio 2015)中将源代码打开,发现数据库连接是关闭的,本想 ...
- [翻译] PJR Signature View
PJR Signature View https://github.com/paritsohraval100/PJRSignatureDemo It is a UIView subclass by w ...
- Linux 系统级别优化_【all】
Linux 系统优化 1.Linux系统关闭SELinux 2.Linux系统开机到登录之前启动流程 3.Linux系统设置运行级别 4.Linux系统重要的开机自启动的服务 5.Linux查看系统当 ...
- zabbix的日常监控-分布式监控(十)
参考博文:http://blog.51cto.com/jinlong/2051966 zabbix proxy 可以代替 zabbix server 检索客户端的数据,然后把数据汇报给 zabbix ...
- php数据结构之二叉树
树是一种比较重要的数据结构, 尤其是二叉树.二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之 分,其次序不能任意颠倒. ...
- python模拟老师授课下课情景
# -*- coding:utf-8 -*- import time class Person(object): ''' 定义父类:人 属性:姓名,年龄 方法:走路(打印:姓名+“正在走路”) ''' ...