记性不如烂笔头29-java应用中的过滤器Filter(1)

过滤器(Filter),功能非常的强大,是Servlet中最重要的技术之一,WEB应用的开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。

1、Filter实现拦截的方法

Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

调用目标资源之前,让一段代码执行。

是否调用目标资源(即是否让用户访问web资源)。

调用目标资源之后,让一段代码执行。

web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对 象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。

2、Filter开发步骤

Filter开发分为二个步骤:

编写java类实现Filter接口,并实现其doFilter方法。

在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

3、JAVA实现的过滤器的范例

过滤器的JAVA代码:

package com.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;

/**

*一个简单的过滤器

*@author 范芳铭

*/

public class EasyFilter implementsFilter{

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("----过滤器初始化----");

}

//过滤器功能在这里实现

@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throwsIOException, ServletException {

//对request和response进行一些预处理

request.setCharacterEncoding("UTF-8");

response.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");

System.out.println("###过滤器执行前!!!");

chain.doFilter(request, response); //让目标资源执行,放行

System.out.println("---过滤器执行后!!!");

}

@Override

public void destroy() {

System.out.println("----过滤器销毁----");

}

}

4、将过滤器添加到Web.xml

<?xml version="1.0"encoding="UTF-8"?>

<web-app version="3.0"

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<display-name></display-name>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

<!--配置过滤器-->

<filter>

<filter-name>easyFilter</filter-name>

<filter-class>com.filter.EasyFilter</filter-class>

</filter>

<!--映射过滤器-->

<filter-mapping>

<filter-name>easyFilter</filter-name>

<!--“/*”表示拦截所有的请求 -->

<url-pattern>/*</url-pattern>

</filter-mapping>

<servlet>

<servlet-name>change</servlet-name>

<servlet-class>com.servlet.RequestDispatcher</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>change</servlet-name>

<url-pattern>/change</url-pattern>

</servlet-mapping>

</web-app>

5、测试过滤器的servlet

package com.servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

/**

*通过request对象获取客户端请求信息,并且进行转发到另外一个页面中

*@author 范芳铭

*/

public class RequestDispatcher extendsHttpServlet {

privatestatic final long serialVersionUID = -4150164731865037680L;

publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

throwsServletException, IOException {

StringrealIp = this.getRealIp(request);

request.setAttribute("realIp",realIp);

//请求转发到change.jsp

request.getRequestDispatcher("/change.jsp").forward(request,response);

}

publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

throwsServletException, IOException {

doGet(request,response);

}

//如果通过代理等方式,IP地址会变化

publicString getRealIp(HttpServletRequest request) {

Stringip = request.getHeader("x-forwarded-for");

if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip= request.getHeader("Proxy-Client-IP");

}

if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip= request.getHeader("WL-Proxy-Client-IP");

}

if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip= request.getRemoteAddr();

}

returnip;

}

}

6、测试结果

###过滤器执行前!!!

---过滤器执行后!!!

过滤器得到了执行。

时间: 2024-10-05 04:44:55

记性不如烂笔头29-java应用中的过滤器Filter(1)的相关文章

记性不如烂笔头33-利用java过滤器实现压缩响应正文内容

在前面的Response的相关内容中,就提到了把数据压缩然后传到浏览器上,通过压缩,能够提升网络文件的传输效率,在很多的场所都需要实用. 如果我们需要在所有的页面都实现压缩,那么是不是把这个加在某一个地方就一起解决了呢?貌似我们能够在过滤器中加载很多的内容,那么是不是也可以把这个也加在过滤器中呢?答案是可以的. 我们可以通过增强HttpServletResponseWrapper对象,压缩响应正文内容. 1. 原理 通过过滤器filter向目标页面传递一个自定义的response对象.在自定义的

好记性不如烂笔头30-java应用中的过滤器Filter(2)

Filter的创建和销毁由WEB服务器负责. web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次.通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象. Web容器调用destroy方法销毁Filter.destroy方法在Filter的生命周期中仅执行一次.在destroy方法中,可以释放过滤器使用的

记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1)

动态代理技术是整个java技术系统中非常重要的一环,它是我们能够深入学习java框架的基础,是深入了解Spring等框架时要掌握的基础知识之一. 1. JAVA中代理的概念 动态代理技术就是用来产生一个对象的代理对象的.直接说好像也很迷糊,好像用不上的样子. (下面的例子部分来自互联网) 举一个现实生活中的例子:歌星或者明星都有一个自己的经纪人,这个经纪人就是他们的代理人,当我们需要找明星表演时,不能直接找到该明星,只能是找明星的代理人.比如王宝强在现实生活中非常有名,会唱歌,会跳舞,会拍戏.王

Servlet中的过滤器Filter详解

转自: http://blog.csdn.net/sd0902/article/details/8395641 web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链. 优点:过滤

jav中的过滤器filter

文章来自 https://www.cnblogs.com/coderland/p/5902878.html Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处理,也可以对HttpServ

记性不如烂笔头21-JAVA数据库连接池 DBCP

用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天100万访问量,数据库服务器就需要创建100万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器连接数溢出,并且用户的使用也会很慢,影响用户体验: 对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标. 数据库连接池针对这些问题创建出来.数据库连接池负责分配,管理和释放数据库资源,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个. 数据库连接

记性不如烂笔头22-JAVA数据库连接池 C3P0

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等.C3P0数据源在项目开发中使用得比较多. 1.c3p0与dbcp区别 dbcp没有自动回收空闲连接的功能 c3p0有自动回收空闲连接功能 c3p0支持更加多的数据库连接池选项. 2.导入相关jar包 c3p0-0.9.0.jar 3.C3P0参数详解 datasource.c3p0.acquireIncrement=10当连接池中的

好记性不如烂笔头50-javaWeb框架struts2中的方法拦截器(5)

1. Struts2的方法拦截器概述 Struts2拦截器也可以通过MethodFilterInterceptor类实现,MethodFilterInterceptor重写了AbstractInterceptor类的intercept(ActionInvocationinvocation)方法,但提供了一个doIntercept(ActionInvocation invocation)抽象方法.从这种设计方式可以看出,MethodFilterInterceptor类的intercept已经实现了

好记性不如烂笔头49-javaWeb框架struts2中的拦截器(4)

1. Struts2的拦截器概述 Struts2拦截器是在访问某个Action或Action的某个方法之前拦截,或者在运行之后处理.Struts2拦截器是可插拔的,拦截器是AOP(Aspect Oriented Programming,面向切面编程)的一种实现 Struts2的拦截器栈(InterceptorStack)就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用. Struts2规定用户自定义拦截器必须实现com