开发者社区> 笔记侠> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Servlet详解
6、Servlet 6.1、Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供了一个接口,叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤: 编写一个类,实现Servlet接口 把开发好的java类部署到web服务器中。
49 0
Servlet用法详解
Servlet用法详解
47 0
Servlet---过滤器
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/75804651 简介 要实现过滤器,必须实现Filter接口,并再web.xml或者注解中定义过滤器。
637 0
Servlet过滤器,Servlet过滤器创建和配置
第一:Servlet的过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的3个方法。        第一方法是过滤器中的init()方法用于对过滤器的初始值进行处理,第二个是destory()方法是过滤器的销毁方法,主要用于释放资源,对于过滤处理的业务逻辑需要编写到doFilter()方法中,在请求过滤处理后,需要调用chain参数的doFilter()方法将请求向下传递给下一个过滤器或者目标资源。
1295 0
[Servlet&JSP] 过滤器的使用
过滤器介于Servlet之前,可拦截过滤浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应。 过滤器的概念 像性能测量、用户验证、字符替换、压缩等需求,应该设计为独立的组件,随时可以添加到应用程序之中,也可以随时移除,而不用修改原有的程序。Servlet/JSP提供了过滤器机制以实现这些组件服务,可视需求抽换过滤器或调整过滤器的顺序,也可以针对不同的
1340 0
+关注
笔记侠
Java开发,喜欢交流,个人网站:https://www.javazhiyin.com/ 欢迎多多交流
158
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载