java应用中的过滤器Filter(1)

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

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

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

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

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

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

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

Filter开发分为二个步骤:

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

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

过滤器的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=""

xmlns:xsi=""

xsi:schemaLocation="

">

<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、测试结果

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

—过滤器执行后!!!

过滤器得到了执行。

既有美妙的风景,也会有称不上景只有风的地方。

java应用中的过滤器Filter(1)

相关文章:

你感兴趣的文章:

标签云: