过滤器的简介和简单应用(禁止缓存,设置中文乱码等)
一 过滤器的简介
1.Filter简介
Seervelt API中提供了一个Filter接口,开发web应用时,如果编写的java类实现了这个接口,则把这个java类称之为过滤器
2.Filter如何拦截的---使用不同的过滤器,拦截不同的请求,形成过滤器链
Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,web服务器每次在调用web资源的servet时,首先都会先调用一下filter的doFilter方法,目的如下:
(1)调用目标资源之前,让一段代码执行
(2)是否调用目标资源
(3)调用目标资源之后,让一段代码执行
二 过滤器的作用
(1)控制请求是否最终能到达目标资源
(2)进行拦截
(3)在chain方法之前的操作,对应答的数据进行的操作
三 Filter的生命周期
public void init(FilterConfig arg0)
throws ServletException {
}
public void destroy() {
}
初始化方法调用是在服务器加载的时候调用,销毁的方法是在服务器停掉的时候,而不是在访问时,并且方法都只调用一次。
四 过滤器开发入门
1.过滤器的执行过程:
请求到达服务器,先读取web.xml文件中的配置文件,通过反射的机制,创建一个Filter对象,看是否与自己的过滤条件相同,如果有过滤器,有chain参数,就查找是否还有下一个过滤器,直到查找不到过滤器,再执行目标文件。
2.过滤器的配置
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.hbsi.web.filter.FilterDemo1</filter-class>
</filter>
<!—-拦截的请求--(所有的)-->
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注:
决定过滤器顺序的是web.xml中的 <filter-mapping>标签
过滤器不能产生应答
3.Java类中继承Filter接口,并实现其中的doFilter方法
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException {
System.out.println("呵呵");
//让请求到达最终资源
chain.doFilter(request,response);
System.out.println("wwwwwwwwwwww");
}
说明:再建一个jsp页面,当执行index.jsp页面前,工程会调用web.xml配置文件,并把配置文件中的filter封装成对象,初始化参数的封装,执行完init方法之后,去调用doFilter方法,一开始输出“呵呵“,然后遇到了chain调用的方法,这个方法是让请求达到最终资源的,所以会执行目标文件(index.jsp),并输出index.jsp中的内容再用response对象返回并输出doFilter方法中的最后一条输出语句。
五 Fileter常见的应用
1. 统一全站字符编码的过滤器
(1)使用的原因:
如果没有过滤器,在每一个页面中都要写上编码方法,如果把编码方法写到过滤器中,只用写一遍,并且在xml文件中配置初始化参数可以不直接指定编码方法,提高灵活性
(2)代码分析
在java中的代码
public class CharSetEncodingFilter implements Filter {
//过滤器统一解决乱码问题
private FilterConfig filterConfig;
public void destroy() {
// TODO Auto-generatedmethod stub
}
private String defaultCharset = "utf-8";
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException{
//模板代码
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse rep = (HttpServletResponse)response;
//得到初始化参数
String charset =filterConfig.getInitParameter("encode");
if(charset==null){
charset = defaultCharset;
}
//请求对象
request.setCharacterEncoding(charset);
//应答对象---一般情况下不设置,因为过滤器不产生应答
rep.setCharacterEncoding(charset);
rep.setContentType("text/html;charset="+charset);
chain.doFilter(req, rep);
}
public void init(FilterConfig config)
throws ServletException {
this.filterConfig=config;
}
}
在xml文件中的配置
<filter>
<filter-name>CharsetEncodeFilter</filter-name>
<filter-class>com.hbsi.web.filter.CharSetEncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
测试类的使用
先在jsp页面中建一个<from>表单,并用post方法提交到一个servelet类中并输出即可看到效果
2. 禁止浏览器缓冲页面中的静态资源
(1)java中的代码分析
public class NoCacheFilter implements Filter {
public void destroy() {
}
//浏览器不缓存页面
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res= (HttpServletResponse)response;
//设置禁止缓存的消息头
res.setDateHeader("expires", -1);
res.setHeader("Cache-Control", "no-cache");
res.setHeader("Pragma", "no-cache");
chain.doFilter(req, res);
}
public void init(FilterConfig arg0)
throws ServletException {
}
}
(2)在web.xml文件中的配置
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
3.设置失效日期
(1)在java中的代码
public class ExpiresFilters implements Filter {
public void destroy() {
}
// 设置失效日期
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
// (1)得到请求的资源 是js css jpg???
String uri = req.getRequestURI();
if (uri.endsWith(".css")) {
// 设置页面的失效日期 是从---1970.1.1.0.0.0开始到某个时间点所经历的毫秒数
long expiresTime = Integer.parseInt(filterConfig.getInitParameter("css")) * 1000;
res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);
} else if (uri.endsWith(".js")) {
long expiresTime = Integer.parseInt(filterConfig.getInitParameter("js")) * 1000;
res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);
} else if (uri.endsWith(".jsp")) {
long expiresTime = Integer.parseInt(filterConfig.getInitParameter("jsp")) * 1000;
res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);
}
chain.doFilter(req, res);
}
private FilterConfig filterConfig;
public void init(FilterConfig config)
throws ServletException {
this.filterConfig = config;
}
}
(2)在web.xml中的配置
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
<init-param>
<!-- css样式的过期时间 jsp jpg都可以-->
<param-name>css</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>jsp</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>jpg</param-name>
<param-value>120</param-value>
</init-param>
</filter>
过滤器的简介和简单应用(禁止缓存,设置中文乱码等)
一 过滤器的简介
1.Filter简介
Seervelt API中提供了一个Filter接口,开发web应用时,如果编写的java类实现了这个接口,则把这个java类称之为过滤器
2.Filter如何拦截的---使用不同的过滤器,拦截不同的请求,形成过滤器链
Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,web服务器每次在调用web资源的servet时,首先都会先调用一下filter的doFilter方法,目的如下:
(1)调用目标资源之前,让一段代码执行
(2)是否调用目标资源
(3)调用目标资源之后,让一段代码执行
二 过滤器的作用
(1)控制请求是否最终能到达目标资源
(2)进行拦截
(3)在chain方法之前的操作,对应答的数据进行的操作
三 Filter的生命周期
public void init(FilterConfig arg0)
throws ServletException {
}
public void destroy() {
}
初始化方法调用是在服务器加载的时候调用,销毁的方法是在服务器停掉的时候,而不是在访问时,并且方法都只调用一次。
四 过滤器开发入门
1.过滤器的执行过程:
请求到达服务器,先读取web.xml文件中的配置文件,通过反射的机制,创建一个Filter对象,看是否与自己的过滤条件相同,如果有过滤器,有chain参数,就查找是否还有下一个过滤器,直到查找不到过滤器,再执行目标文件。
2.过滤器的配置
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.hbsi.web.filter.FilterDemo1</filter-class>
</filter>
<!—-拦截的请求--(所有的)-->
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注:
决定过滤器顺序的是web.xml中的 <filter-mapping>标签
过滤器不能产生应答
3.Java类中继承Filter接口,并实现其中的doFilter方法
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException {
System.out.println("呵呵");
//让请求到达最终资源
chain.doFilter(request,response);
System.out.println("wwwwwwwwwwww");
}
说明:再建一个jsp页面,当执行index.jsp页面前,工程会调用web.xml配置文件,并把配置文件中的filter封装成对象,初始化参数的封装,执行完init方法之后,去调用doFilter方法,一开始输出“呵呵“,然后遇到了chain调用的方法,这个方法是让请求达到最终资源的,所以会执行目标文件(index.jsp),并输出index.jsp中的内容再用response对象返回并输出doFilter方法中的最后一条输出语句。
五 Fileter常见的应用
1. 统一全站字符编码的过滤器
(1)使用的原因:
如果没有过滤器,在每一个页面中都要写上编码方法,如果把编码方法写到过滤器中,只用写一遍,并且在xml文件中配置初始化参数可以不直接指定编码方法,提高灵活性
(2)代码分析
在java中的代码
public class CharSetEncodingFilter implements Filter {
//过滤器统一解决乱码问题
private FilterConfig filterConfig;
public void destroy() {
// TODO Auto-generatedmethod stub
}
private String defaultCharset = "utf-8";
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException{
//模板代码
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse rep = (HttpServletResponse)response;
//得到初始化参数
String charset =filterConfig.getInitParameter("encode");
if(charset==null){
charset = defaultCharset;
}
//请求对象
request.setCharacterEncoding(charset);
//应答对象---一般情况下不设置,因为过滤器不产生应答
rep.setCharacterEncoding(charset);
rep.setContentType("text/html;charset="+charset);
chain.doFilter(req, rep);
}
public void init(FilterConfig config)
throws ServletException {
this.filterConfig=config;
}
}
在xml文件中的配置
<filter>
<filter-name>CharsetEncodeFilter</filter-name>
<filter-class>com.hbsi.web.filter.CharSetEncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
测试类的使用
先在jsp页面中建一个<from>表单,并用post方法提交到一个servelet类中并输出即可看到效果
2. 禁止浏览器缓冲页面中的静态资源
(1)java中的代码分析
public class NoCacheFilter implements Filter {
public void destroy() {
}
//浏览器不缓存页面
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res= (HttpServletResponse)response;
//设置禁止缓存的消息头
res.setDateHeader("expires", -1);
res.setHeader("Cache-Control", "no-cache");
res.setHeader("Pragma", "no-cache");
chain.doFilter(req, res);
}
public void init(FilterConfig arg0)
throws ServletException {
}
}
(2)在web.xml文件中的配置
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
3.设置失效日期
(1)在java中的代码
public class ExpiresFilters implements Filter {
public void destroy() {
}
// 设置失效日期
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
// (1)得到请求的资源 是js css jpg???
String uri = req.getRequestURI();
if (uri.endsWith(".css")) {
// 设置页面的失效日期 是从---1970.1.1.0.0.0开始到某个时间点所经历的毫秒数
long expiresTime = Integer.parseInt(filterConfig.getInitParameter("css")) * 1000;
res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);
} else if (uri.endsWith(".js")) {
long expiresTime = Integer.parseInt(filterConfig.getInitParameter("js")) * 1000;
res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);
} else if (uri.endsWith(".jsp")) {
long expiresTime = Integer.parseInt(filterConfig.getInitParameter("jsp")) * 1000;
res.setDateHeader("Expires", System.currentTimeMillis()+expiresTime);
}
chain.doFilter(req, res);
}
private FilterConfig filterConfig;
public void init(FilterConfig config)
throws ServletException {
this.filterConfig = config;
}
}
(2)在web.xml中的配置
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
<init-param>
<!-- css样式的过期时间 jsp jpg都可以-->
<param-name>css</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>jsp</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>jpg</param-name>
<param-value>120</param-value>
</init-param>
</filter>
分享到:
相关推荐
NULL 博文链接:https://h496950806.iteye.com/blog/2043998
该程序使用eclipse作为开发工具,mysql作为数据库。...dwz框架中的乱码问题不用太管,spring mvc自带的过滤器已经配置好了,网页发布到tomcat服务器后查看不会有乱码。 希望能帮到大家。也感谢给我帮助过的人。
4-2 当表单提交信息中包括汉字时,在获取时应该做怎样的处理? 使用request.setCharacterEncoding(“gb2312”) 4-3 如何实现禁用缓存功能? 通过设置HTTP头可实现禁用缓存功能,具体代码如下: ("Cache-Control",...
简单明了的任务管理器.reg 将mp3的音质调整到96kbps.reg 进入Windows后自动打开数字小键盘.reg 禁用长文件名中的~字符.reg 禁用关闭系统.reg 禁止访问任务栏的属性.reg 禁止改变工具栏的内容.reg 禁止删除...
3.6.4 Solr分词器、过滤器、分析器 42 3.6.5 Solr高亮使用 46 4 SolrJ的用法 46 4.1 搜索接口的调用实例 46 4.2 Solrj的使用说明 47 4.2.1 Adding Data to Solr 47 4.2.2 Directly adding POJOs to Solr 49 4.2.3 ...
项目简介:此项目只是简单的集成spring+springmvc+shiro+ehcahce 二: 步骤说明: 1:项目集成spring 在web.xml中配置spring容器的监听器。 2:项目集成springmvc 在web.xml中配置前端控制器 3:项目集成...
完善的AOP支持,可以在应用和模块分别设置监听器,轻松完成切面编程 提供的大量的字符串工具,网络工具,二维码工具,文件处理,图片上传,缓存工具,同步锁等,可以很方便的实现生成分布式唯一ID, RSA加密, ...
是飞速创想(北京)科技有限公司推出的一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务。JspRun! 的基础...
是飞速创想(北京)科技有限公司推出的一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务。JspRun! 的基础...
Phpvod从创立之初即以提高产品效率为突破口,随着编译模板,数据缓存等技术的应用,和坚固的数据结构及最少化数据库查询设计,使得PHPvod 可以在极为繁忙的服务器环境下快速稳定运行,切实节约网站成本。 支持用户...
系统设置项分成几大类:[基本设置]、[网站信息]、[安全设置]、[用户选项设置]、[邮件选项设置]、[注册选项设置]、[系统选项设置]、[上传选项设置]、[验证码设置]、[官方通讯设置]、[服务升级设置]、[支持接口设置] ...
是飞速创想(北京)科技有限公司推出的一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务。JspRun! 的基础...
是飞速创想(北京)科技有限公司推出的一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务。JspRun! 的基础...
是飞速创想(北京)科技有限公司推出的一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务。JspRun! 的基础...
是飞速创想(北京)科技有限公司推出的一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务。JspRun! 的基础...
小练习小项目练手使用JSP实现页面显示使用Servlet进行流程控制使用JavaBean实现业务封装使用数据源+JDBC访问数据库使用jQuery进行页面交互使用过滤器完成中文乱码的问题使用Servlet 3.0的注解实现Servlet声明使用...
11.解决后台编辑器之前空2格低于一个汉字的问题 12.完善几个细节问题 13.整合20121103~20121220补丁 2012年12月20日 ★更新方式:admin文件夹改成你后台目录名,然后补丁包里的所有文件覆盖进去。 1.富媒体...
以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向对象等内容。...
以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向对象等内容。...