Servlet之过滤器详解

Servlet分为三种:标准的Servlet----MVC中控制器 、过滤Servlet(过滤器)、监听Servlet(监听器)。

这篇博客将结合实例来讲解过滤Servlet(过滤器)。

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过过滤器,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

过滤器一般是在开发之后加入到Web工程,过滤器的功能:

1,判断是否是非法用户(判断session是否存在属性)

2,屏蔽非法文字(反动、骂人之类的敏感词)

3,对请求的内容进行统一的编码

判断非法用户应该是最最常用的了,很多网站都会进行筛选,对于未登录的用户,某些特定的模块或者功能不能进行访问或者操作,那么它是如何实现的呢?

首先在在web.xml中进行配置:

<filter>
	    <filter-name>Limit</filter-name>
	    <filter-class>org.jvsun.tools.FilterNo</filter-class>
	    </filter>
	<filter-mapping>
	    <filter-name>Limit</filter-name>
	    <url-pattern>/*</url-pattern>
	</filter-mapping> 

/*表示过滤掉所有的请求,这时候访问项目下的任何文件,都是没有响应的。 配置完后我们还要放行部分模块或者把设置符合某些设置的条件的模块放行:

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;
import javax.servlet.http.HttpSession;
public class FilterCRM implements Filter {
	public void destroy() {
		System.out.println("销毁过滤器");
	}
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest)arg0;
		HttpServletResponse response = (HttpServletResponse)arg1;
		String path = request.getContextPath();//获取根路径
		request.setCharacterEncoding("utf-8");//统一编码格式
		String url = request.getRequestURI();//获取请求页面的相对路径
		HttpSession session = request.getSession();//获取本次会话中的session值

		//过滤没有登录session的非法用户,过滤全部,放行登录相关模块,如登陆检测servlet和验证码的servlet
		if(null == session.getAttribute("pojo")
				&& url.indexOf("login.jsp") == -1
				&& url.indexOf("CheckLoginId") == -1
				&& url.indexOf("VerifyCodeServlet") == -1){
			response.sendRedirect(path+"/manager/login.jsp");
		}
		else{
			arg2.doFilter(arg0, arg1);//不符合过滤条件,向下转发
		}
	}

	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("初始化过滤器");

	}

}

上面代码中注释很清楚了,这段代码中不进行过滤的有:含有session信息的所有模块,登录模块,登录处理以及验证码处理。

对请求的内容进行统一的编码,这里统一UTF-8:

web.xml中的配置:

<filter>
      <filter-name>setCharacterEncoding</filter-name>
      <filter-class>org.jvsun.tools.EncodingFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
      </init-param>
</filter>
<filter-mapping>
     <filter-name>setCharacterEncoding</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping> 

新建一个EncodingFilter类,实现Filter接口,对所有请求内容设置UTF-8编码:

import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {
    private String encoding;
    private Map<String, String> params = new HashMap<String, String>();
    public void destroy() {
    	System.out.println("销毁过滤器");
        params=null;
        encoding=null;
    }
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        req.setCharacterEncoding(encoding);
        chain.doFilter(req, resp);
    }  

    public void init(FilterConfig config) throws ServletException {
        System.out.println("初始化拦截器");
        encoding = config.getInitParameter("encoding");
        for (Enumeration e = config.getInitParameterNames();
        	e.hasMoreElements();) {
            String name = (String) e.nextElement();
            String value = config.getInitParameter(name);
            params.put(name, value);
        }
    }
 }  
时间: 2024-12-03 20:46:58

Servlet之过滤器详解的相关文章

Servlet开发入门(2) 一个Servlet程序运行详解

知道了Servlet的作用后,我们来看一个Servlet的程序运行实例,为什么要看运行实例呢?因为要想成功运行一个Servlet程序,需要配置一些文件. Servlet程序的编写 开发一个可以处理的HTTP请求的Servlet程序,肯定是要继承HttpServlet类,而且在自定义中Servlet类中至少还要覆写HttpServlet类中提供的doGet()方法,方法如下: public void doGet(HttpServletRequest req,HttpServletResponse

AngularJS入门教程之过滤器详解_AngularJS

在这一步你将学习到如何创建自己的显示过滤器. 请重置工作目录: git checkout -f step-9 现在转到一个手机详细信息页面.在上一步,手机详细页面显示"true"或者"false"来说明某个手机是否具有特定的特性.现在我们使用一个定制的过滤器来把那些文本串图形化:√作为"true":以及×作为"false".来让我们看看过滤器代码长什么样子. 步骤8和步骤9之间最重要的不同在下面列出.你可以在GitHub里看到

Servlet/JSP配置详解(基础篇)

js|servlet|详解 初学者问的诸如:<怎样配置环境变量><怎样运行Servlet>啊?这样的问题太多了,现在我写一个初学者入门必读,以便对初学者有指导作用! 首先是下载工具: 我建议初学者用Editplus+JDK,我觉得如果用例如JB,Eclipse,JCreator,虽然刚开始的时候比较方便,但是确使初学者门不知道怎样配置环境变量,从而难以达到知其然,知其所以然的地步. 可以通过如下地址下载: Editplus(最新版本是v2.11):http://count.skyc

怎样使用Java Servlet动态生成图片详解

servlet|动态|详解 在Web应用中,经常需要动态生成图片,比如实时股市行情,各种统计图等等,这种情况下,图片只能在服务器内存中动态生成并发送给用户,然后在浏览器中显示出来. 本质上,浏览器向服务器请求静态图片如JPEG时,服务器返回的仍然是标准的http响应,只不过http头的contentType不是text/html,而是image/jpeg而已,因此,我们在Servlet中只要设置好contentType,然后发送图像的数据流,浏览器就能正确解析并显示出图片. 在Java中,jav

Servlet/JSP配置详解

js|servlet|详解 初学者问的诸如:<怎样配置环境变量><怎样运行Servlet>啊?这样的问题太多了,现在我写一个初学者入门必读,以便对初学者有指导作用! 首先是下载工具: 我建议初学者用Editplus+JDK,我觉得如果用例如JB,Eclipse,JCreator,虽然刚开始的时候比较方便,但是确使初学者门不知道怎样配置环境变量,从而难以达到知其然,知其所以然的地步. 可以通过如下地址下载: Editplus(最新版本是v2.11):http://count.skyc

Servlet生命周期详解

一.基本概念Servlet生命周期分为三个阶段 1.初始化阶段                调用init()方法 2.响应客户请求阶段     调用service()方法 3.终止阶段                   调用destroy()方法 二.详解1.初始化阶段在下列时刻Servlet容器装载Servlet: ①Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的之间添加代码:<load-on-startup>1</load-on-star

Java中的Filter过滤器详解

Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处理,也可以对HttpServletResponse 进行后处理.使用Filter 的完整流程:Filter 对用户请求进行预处理,接着将

Spring Cloud内置的Zuul过滤器详解

我是51CTO学院讲师周立,在51CTO学院"4.20 IT充电节"(4月19~20日)到来之际,和大家分享一下<Spring Cloud内置的Zuul过滤器应用>的经验.正文来啦~~~ Spring Cloud默认为Zuul编写并启用了一些过滤器,这些过滤器有什么作用呢?我们不妨按照@EnableZuulServer.@EnableZuulProxy两个注解进行展开,相信大家对这两个注解都不陌生(至少都见过吧).如果觉得陌生也没有关系,可将@EnableZuulProxy

AngularJS的内置过滤器详解

  在我们开发中经常需要在页面显示给用户的信息需要一定处理格式化,才能显示给用户.在angularjs中为我们提供了叫filter的指令,让我们能够很轻易就能做到着一些列的功能,angularjs内部为我们提供了number等很多内置的filter. 今天我们来了解一下AngularJS的内置过滤器 先来看看这些内置过滤器使用方法: 一个过滤器,不带参数的情况 {{expression | filter}} 一个过滤器,带参数的情况 {{expression | filter:arguments