Servlet之过滤器详解

简介: Servlet分为三种:标准的Servlet----MVC中控制器 、过滤Servlet(过滤器)、监听Servlet(监听器)。 这篇博客将结合实例来讲解过滤Servlet(过滤器)。 Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过过滤器,开发人员可以实现用户在访问某个目标资源

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);  
        }  
    }  
 }  





目录
相关文章
|
2天前
|
容器
Servlet 教程 之 Servlet 编写过滤器 6
该教程介绍了如何在Servlet中编写过滤器。可以创建多个过滤器,如AuthenFilter和LogFilter,并通过不同的映射进行配置。过滤器的应用顺序由web.xml中filter-mapping的顺序决定,可通过调整顺序改变过滤器执行的先后。
10 3
|
4月前
|
前端开发 Java 程序员
Servlet/过滤器/拦截器/监听器:
Servlet接口在Sun公司有两个默认的实现类:HttpServlet、GenericServlet。Servlet是一种运行服务器端的Java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。
|
8月前
|
存储 Java 数据安全/隐私保护
servlet过滤器与监听器
前言 Servlet 过滤器和监听器是 Java Web 应用程序中常见的两种组件,它们提供了各种扩展 Web 应用程序功能的方式。 总的来说,过滤器和监听器都可以通过 Java Web 应用程序的配置文件或注解进行使用,方便灵活,并可以很好地实现框架与业务逻辑的分离,提高代码可维护性和扩展性。 过滤器(Filter) 1. 参数验证和转换:可以拦截用户提交的数据,并对数据格式进行验证、修正或转换。 2. 访问控制和认证:可以拦截请求并检查用户是否有访问特定资源的权限。 3. 日志记录:可以拦截请求并输出相应的日志信息,用于系统运行时的监测与故障排除。 4. 资源压缩和解密: 可以拦截响应并对
49 0
|
10月前
|
Java 数据安全/隐私保护
【Java Web编程 十】深入理解Servlet过滤器
【Java Web编程 十】深入理解Servlet过滤器
91 0
|
11月前
|
Java 容器
Servlet 过滤器方法
Servlet 过滤器方法
55 0
|
11月前
|
XML Java 数据安全/隐私保护
JSP 和 Servlet 中的过滤器都是 Java 类。
JSP 和 Servlet 中的过滤器都是 Java 类。
60 0
Servlet学习——过滤器
Servlet学习——过滤器
47 0
|
XML 设计模式 前端开发
Servlet、过滤器、监听器、拦截器
Servlet是javaEE规范中的一种,javaEE中的规范很多除了Servlet还有很多我们熟悉的JSP、JDBC、RMI、XML、EJB、JTS等等。
125 0
Servlet、过滤器、监听器、拦截器
|
前端开发 Java 应用服务中间件
servlet中的Filter接口(过滤器接口)
servlet中的Filter接口(过滤器接口)
166 0
servlet中的Filter接口(过滤器接口)
|
前端开发 Java 数据安全/隐私保护
用servlet和过滤器实现简单的权限管理和敏感词过滤功能
用servlet和过滤器实现简单的权限管理和敏感词过滤功能
用servlet和过滤器实现简单的权限管理和敏感词过滤功能