⑧javaWeb之在例子中学习(过滤器Filter)
前言
本系列 Servlet & JSP 学习系列[传送门]逐渐到了中期了,希望大家喜欢我写的,总结的点点滴滴-
今天我们来讲讲过滤器
你们的支持是我写博客的动力哦。
最近买了两本书,觉得大二了。每个月的零花钱中买几本书,一年也能买二三十本。不亦乐乎!分享下

虽然看不懂,先看吧。至少不亏,以后温故知新.
Fitler(过滤器)
过滤器filter是拦截请求,并对传给请求资源的ServletRequest 或 ServletResponse 进行处理的一个对象。可以用于登录,加密和解密,会话检查,图片转换等等
过滤器执行机制图:

Filter API : http://docs.oracle.com/javase/6/docs/api/
Filter详解
Filter接口的构成:
所有的Filter类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:
①init(FilterConfig):这是Filter的初始化方法,Servlet容器创建Filter实例后将调用这个方法。在这个方法中可以读取web.xml文件中Filter的初始化参数
②doFilter(ServletRequest,ServletResponse,FilterChain): 这个方法完成实际的过滤操作,当客户请求访问于Filter关联的URL时,Servlet容器将先调用Filter的doFilter方法。FilterChain参数用于访问后续Filters
③destroy(): Servlet容器在销毁Filter实例前调用该方法,这个方法中可以释放Filter占用的资源
配置Filter(下面例子用的是注释配置)
<filter>
<filter-name>enconfigFilter</filter-name>
<filter-class>com.filter.EnconfigFilter</filter-class>
<init-param>
<param-name>enconfig</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>enconfigFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中:
filter-name 指定过滤器的名字
filter-class 指定过滤器的类名
init-param 为过滤器实例提供初始化参数,可以有多个
url-pattern 指定和过滤器关联的URL,为”/*”表示所有URL
图片保护过滤器
咱们用ImageProtetorFilter来保护咱们的图片,防止地址栏中直接输入图片URL 来下载图片。
小小的原理:
过滤器通过查看HTTP 标头的referer的值进行工作。值为空表示当前请求没有相当的引用页。而值为空,说明请求在引用页,自然图片在jsp里面供认看与下载。
小朽尝试:
①包结构

② ImageProtector类
doFilter实现了,获取标头→判断→然后抛异常
package sedion.jeffli.filter; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest; /**
*
* @author Jeff Li
*
*/
@WebFilter(filterName = "ImageProtetorFilter",urlPatterns={"*.png","*.jpg","*.gif"})
public class ImageProtector implements Filter{ @Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("ImageProtetorFilter");
HttpServletRequest httpServletR = (HttpServletRequest)request;
String referrer = httpServletR.getHeader("referer");
System.out.println("referrer:"+referrer);
if(referrer != null){
chain.doFilter(request, response);
}else{
throw new ServletException("Image not available");
} } @Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub } }
③JSP 页面加入
<img alt="logo" src="logo.jpg">
小朽看效果说话:
①当直接在火狐中,打开url:http://localhost:8080/filterTest/logo.jpg
页面出现了 HTTP Status 500 - Image not available
打开小蜜蜂(firebug),查看网络,发现没有referer请求头信息
②当直接在火狐中,打开url:http://localhost:8080/filterTest/index.jsp
页面自然出现了图片。
打开小蜜蜂(firebug),查看网络

下载过滤器
顾名思义,计算某个资源下载了多少次,或知道某些东石受欢迎程度。自然这个必不可少。
Question and Solving:
我们将值保存在一个属性文件中,并且多个线程可以同时访问一个过滤器,因此就有一个线程安全性的问题需要解决。用户请求资源读取相应属性值,将它赠一个并存回新值。如果第一个线程完成任务前,又有第二个用户请求同一个资源,怎么办?同步读写值的代码似乎不是个好方法,涉及到扩展性的问题。
我们利用Queue 和 Executor 解决这个线程的问题。所有进来的请求都在一个线程Executor队列中放置一项任务。放置任务比较快,因为这是一个异步的操作。由于只有使用一个Executor一个线程,因此消除了多线程访问该属性文件的可能。
小朽尝试:
就加个DownloadCounterFilter,启动就好。
package sedion.jeffli.filter; import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
*
* @author Jeff Li
*
*/ @WebFilter(filterName="DownloadCounterFilter",urlPatterns={"/*"})
public class DownloadCounterFilter implements Filter{ ExecutorService executorService = Executors.newSingleThreadExecutor();
Properties downloadLog;
File logFile; @Override
public void destroy() {
executorService.shutdown();
} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request; final String uri = httpServletRequest.getRequestURI();
executorService.execute(new Runnable() { @Override
public void run() {
String property = downloadLog.getProperty(uri); if(property == null){
downloadLog.setProperty(uri, "1");
}else{
int count = 0;
try {
count = Integer.parseInt(property);
} catch (NumberFormatException e) {
}
count++;
downloadLog.setProperty(uri, Integer.toString(count));
} try {
downloadLog.store(new FileWriter(logFile), "");
} catch (Exception e) {
}
}
}); chain.doFilter(request, response);
} @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("DownloadCounterFilter");
String appPath = filterConfig.getServletContext().getRealPath("/");
logFile = new File(appPath,"downloadLog.txt"); if(!logFile.exists()){
try {
logFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
} downloadLog = new Properties();
try {
downloadLog.load(new FileReader(logFile));
} catch (IOException e) {
e.printStackTrace();
}
} }
小朽分析下:
String appPath = filterConfig.getServletContext().getRealPath("/");
logFile = new File(appPath,"downloadLog.txt");
if(!logFile.exists()){
try {
logFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
项目路径下:tomcat_dir/filterTest/ 如果没有文件downloadLog.txt,初始化生成。当访问项目有关文件,则会记录到这个property文件中。
小朽看效果:
打开tomcat_dir/filterTest/downloadLog.txt
#
#Thu Mar 20 12:39:02 CST 2014
/filterTest/logo.jpg=3
/filterTest/=1
/filterTest/index.jsp=2
总结
寄读者,寄知识来源
读者,你好!你我不相识,谢谢你们支持。只有记录点滴,我的梦想会越来越接近。共勉!
知识来源 http://book.douban.com/doulist/3575997/
⑧javaWeb之在例子中学习(过滤器Filter)的更多相关文章
- Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例
Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...
- java Servlet中的过滤器Filter
web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...
- Servlet中的过滤器Filter用法
1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...
- Servlet中的过滤器Filter详解
加载执行顺序 context-param->listener->filter->servlet web.xml中元素执行的顺序listener->filter->stru ...
- java中的过滤器 --Filter
package filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.Filter ...
- django中html过滤器filter
http://blog.csdn.net/iloveyin/article/details/49560559 safe让Html标签以及一些特殊符号(如<)生效,下面以例子说明: # value ...
- AngularJS学习--- 过滤器(filter),格式化要显示的数据 step 9
1.切换目录,启动项目 git checkout step- npm start 2.需求: 格式化要显示的数据. 比如要将true-->yes,false-->no,这样相互替换. 3. ...
- Servlet中的过滤器Filter
链web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...
- serlvet中的过滤器filter
1.概念 过滤作用,对从客户端向服务器端发送的请求进行过滤,也可以对服务器端返回的响应进行处理.它使用户可以改变一个request和修改一个 response..Filter 不是一个servlet, ...
随机推荐
- 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB
走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...
- PHP与Excel 笔记
一: PHP将数据导出Excel表中(投机型) 二: PHPExcel: Github上可以下载此插件包,用法如下: 前端: //上传阅卷员Excel文件 $("#upload_memb ...
- sjms-4 行为型模式
行为型模式 责任链模式 内容:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.角色:抽象处理者(Hand ...
- Eclipse导入web项目报错找不到HttpServletRequest解决方法
解决方法 右击项目-> Properties -> Java Build Path -> Add Library -> Server Runtime -> next -& ...
- 手机端-万种bt在线观看器,安卓正版下载
安卓正版下载, 点击下载 无广告,完全免费!寻找任何你想要的资源!
- jwt vs session 以rails 为例 (翻译部分)
原文地址:https://pragmaticstudio.com/tutorials/rails-session-cookies-for-api-authentication 普通方式: 令牌为基础的 ...
- 网络操作系统 第七章 管理TCP/IP网络
本章小结 本章介绍了TCP/IP的相关概念,并且在此处基础上,介绍了Windows Server 2008中使用TCP/IP网络配置工具实现网络连接和管理的方法,在Linux系统中,讲解了是如何使用图 ...
- 网络操作系统 第六章 Window Server 2008 活动目录
本章小结 在企业网络中,活动目录是必不可少的,它将网络中各种对象组织起来进行管理,方便了网络对象的查找,增强了网络的安全性,为用户的物流管理提供了极大的便利,本章首先介绍了活动目录的基本概念,然后通过 ...
- Gigabyte Z170N-WIFI 黑苹果 10.12
简述 (此文在我的个人博客长期更新)[http://aiellochan.com/2018/02/11/play/Gigabyte-Z170N-WIFI-%E9%BB%91%E8%8B%B9%E6%9 ...
- mybatis 中的缓冲
package com.oaec.mybatis.test; import com.oaec.mybatis.dao.StudentDao;import com.oaec.mybatis.entity ...