JAVAWEB Filter使用

Filter学习
 1Filter是什么:是过滤器简称
 2Filter有什么作用:在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行            包装,再把包装对象传给目标资源,从而实现一些特殊需求。
  Example: 举一个不恰当的例子:比如当我们喜欢的人电话给我们,我们想手机提供不一样的铃声,
        让我来区分是谁打电话给我,这样我就不用拿出手机出来,才知道谁打电话给我
 3Filter运行原理解析
 如下图:
 

3Filter接口的介绍:
 ①FilterConfig接口:用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始            化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:

  String getFilterName():得到filter的名称。
  String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
  Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  public ServletContext getServletContext():返回Servlet上下文对象的引用。

②FilterChian接口:在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
          web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表            Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain          对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源(就是URL的资源)。

 3Filter怎样使用:
  使用步骤:

    1自定义Filter,并实现内置的Filter接口
    2复写doFilter()方法,在里面处理我们需要的逻辑
    3若还有其他过滤器就调用FilterChian的doFilter()方法
    4若返回页面就是用response
    5注册Filter,配置Filter拦截怎样的请求
 4JAVAWEB的Filter代码示例
①自定义Filter:

package com.filter.demo;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharacterEncodingFilter implements Filter{

    FilterConfig filterConfig=null;
    String characterEncoding="UTF-8";
    String str;
    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) arg0;
        HttpServletResponse response=(HttpServletResponse) arg1;
        System.out.println("拦截到请求了");
        System.out.println("编码为---->"+str);
        if (str==null) {
            System.out.println();
            str=characterEncoding;
        }
        //2设置编码
        request.setCharacterEncoding(str);
        response.setCharacterEncoding(str);
        request.setAttribute("name", "jere");
        System.out.println("执行前--->name="+request.getAttribute("name"));
        //返回下一个Filter
        arg2.doFilter(request, response);
        System.out.println("执行后--->name="+request.getAttribute("name"));
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println(this.getClass().getName()+"过滤器启动了-----");
        //获取启动的时的参数
        filterConfig=arg0;
        str=filterConfig.getInitParameter("name");
    }

}

自定义Servlet:

package com.filter.demo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.jasper.tagplugins.jstl.core.Out;

/**
 * Servlet implementation class FilterServlet
 */
public class FilterServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public FilterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().print("test");
        request.setAttribute("name", "jeremy");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

③在web.xml文件注册Servlet和Filter
  

 <servlet>
    <description></description>
    <display-name>FilterServlet</display-name>
    <servlet-name>FilterServlet</servlet-name>
    <servlet-class>com.filter.demo.FilterServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FilterServlet</servlet-name>
    <url-pattern>/FilterServlet</url-pattern>
  </servlet-mapping>
  <filter>
          <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.filter.demo.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
  </filter>
  <filter-mapping>
          <filter-name>CharacterEncodingFilter</filter-name>      <!-- 也可以使用URL-Pattern -->
          <servlet-name>FilterServlet</servlet-name>
  </filter-mapping>

页面测试

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="/FilterDemo/FilterServlet">test Filter</a>
</body>
</html>

以上就是简单的FIlter示例

时间: 2024-10-08 08:49:21

JAVAWEB Filter使用的相关文章

学习日记:关于javaweb filter中过滤了css文件的解决方法

这是搬运以前的笔记. 在用javaweb做项目时,遇到了filter把css文件等过滤了,导致HTML的布局失效,解决方法是再filter中进行判断,当遇到css文件,png,jpg图片等时,放行.代码如下 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletReques

JavaWeb——Filter

一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候,就闲话不絮了. Filter称之为过滤器,是用来做一些拦截的任务.比如客户端请求服务器的某个资源时(可以是Servlet.JSP.HTML等等),我们可以拦截.当服务器返回资源给客户端的时候,我们也可以拦截.这样我们就可以在调用资源之前和之后分别加入一些业务逻辑. 当我们对某个资源加上多个过滤器的

Filter的常见应用

1.字符编码过滤器 实现功能,在a.jsp中填写用户名提交到b.jsp,在b.jsp中读取参数名. a.jsp <body> <form action="encoding/b.jsp" method="post"> name:<input type="text" name="username"/> <input type="submit" value="S

JavaWeb监听器和过滤器

JavaWeb监听器 ServletContextListener监听器 Servlet的上下文监听,它主要实现监听ServletContext的创建和销毁.可以完成自己想要的初始化工作.主要包括下面两个方法 //启动服务的时候调用该方法 public void contextInitialized(ServletContextEvent sce); //销毁该服务的时候调用该方法 public void contextDestroyed(ServletContextEvent sce); Se

JavaWeb三大组件之一Filter知识总结

[1] Filter简介    > Filter翻译为中文是过滤器的意思.    > Filter是JavaWeb的三大web组件之一Servlet.Filter.Listener    > Filter的作用是在请求到达WEB资源(HTML.CSS.Servlet.JSP)之前进行拦截.    > Filter需要交给Tomcat访问器来管理    > Filter的作用:        1.Filter可以在请求到达目标资源之前进行拦截        2.Filter也可

JavaWeb:Filter

Filter: 1).what? ①.JavaWeb 的一个重要组件,可以对发送到 Servlet 的请求进行拦截,并对响应也进行拦截. ②.Filter 是实现了 Filter 接口的 Java 类. ③.Filter 需要在 web.xml 文件中进行配置和映射. 2).如何创建一个 Filter ,并把它跑起来. ①.创建一个 Filter 类:实现 Filter 接口  public class HelloFilter implements Filter ②.在 web.xml 文件中配

javaweb学习总结(四十六)——Filter(过滤器)常见应用

一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.Serv

JavaWeb三大组件—过滤器filter

JavaWeb三大组件 1. 都需要在web.xml中进行配置ServletListener(2个感知监听器不需要配置)Filter 2. 过滤器 它会在一组资源(jsp.servlet..css..html等等)的前面执行! 它可以让请求得到目标资源,也可以不让请求达到! * 过滤器有拦截请求的能力! 登录:允许它访问AServlet.BServlet.CServlet ------------------------------- 过滤器如何编写 1. 写一个类实现Filter接口2. 在w

JAVA学习篇--javaweb之Filter详解

在DRP项目中,多次提到了Filter,它解决了字符集的统一设置以及统一控制简单WebCache,从中我们可以体会到,它给我们带来的好处不仅仅是减少代码量这么简单,它的出现避免了我们每个页面重复的编写相同的代码,减少了我们的工作量,而且给维护带来了极大的便利,那么它是如何实现统一管理的呢?既然它能统一管理某些重复的操作,那么它和AOP有什么关系呢? Filter简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过