`

web.xml之过滤器详解 以及常用过滤器demo

阅读更多
web.xml之过滤器详解


一、过滤器介绍(是个什么东西)

filter功能.它使用户可以改变一个request和修改一个 response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).一个filter 包括:
1. 在servlet被调用之前截获;
2. 在servlet被调用之前检查servlet request;
3. 根据需要修改request头和request数据;
4. 根据需要修改response头和response数据;
5. 在servlet被调用之后截获.


二、执行步骤

①项目启动实例化
②调用init方法初始化(为执行过滤做准备)
③调用dofilter执行过滤方法(用户在前后端交互操作时)
④调用destory方法销毁(在线程退出、超时或者停止项目时)


三、过滤器配置

①在xml注册声明以及映射等操作
②在过滤器实现类中实现filter接口


四、过滤器接口介绍

1、init(用来初始化)
2、dofilter(用来执行具体的操作)
此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤   器,如果是最后一个过滤器,则下一个就调用目标资源。
3、destory(用来销毁)


重要备注:::
在web.xml中你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用.
本次例子会附上:
1、字符集编码格式过滤
2、sql防注入过滤
3、不缓存页面的过滤器



具体的代码案例
一、配置

<filter>//过滤器实现,以及地址
		<filter-name>patronliFilter</filter-name>//定义名字
		<filter-class>com..servlet.FwpFilter</filter-class>//实现类
</filter>
<filter-mapping>//映射过滤器拦截规则
		<filter-name>patronliFilter</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
</filter-mapping>
//如果想要配置多个拦截器,可以依次向下写


二、具体的实现类以及实现的拦截功能(字符集编码格式过滤)
package com.patronli.servlet;

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

import org.apache.commons.lang.StringEscapeUtils;

public class patronliFilter implements Filter {

	@Override
	public void destroy() {
		System.out.println("执行了初始化方法......");
	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) arg0;
		HttpServletResponse response = (HttpServletResponse) arg1;
		// 设置字符集编码
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		// HttpSession session = request.getSession();
		// String url = request.getServletPath();
		Map<String, String[]> map = request.getParameterMap();
		// 一下方法可以打印出来用户请求和返回的参数以及响应请求地址
		// 生产测试遇到问题查起来很方便
		System.out.println("请求或响应的地址为:::" + request.getRequestURI());
		for (Map.Entry<String, String[]> entry : map.entrySet()) {
			for (String str : entry.getValue()) {
				System.out.println("请求或响应的参数有:::" + entry.getKey() + ":" + str);
				str = StringEscapeUtils.escapeHtml(str);
			}
		}
		// 会去顺序执行当前过滤器下面的过滤
		arg2.doFilter(arg0, arg1);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("执行了销毁的方法...");
	}

}


(sql防注入过滤)

package com.patronli.servlet;


import java.io.IOException;
import java.util.Enumeration;

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 com.fuiou.fwp.util.ConfigReader;

/**
 * 过滤sql关键字的Filter
 * 
 */
public class PatronliFilter implements Filter {
	
	public void init(FilterConfig filterConfig) throws ServletException {
		// throw new UnsupportedOperationException("Not supported yet.");
	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

			HttpServletRequest req = (HttpServletRequest) request;
			HttpServletResponse res = (HttpServletResponse) response;
			String requestUri = req.getRequestURI();
			// 获得所有请求参数名
				Enumeration params = req.getParameterNames();
				System.out.print(req.getRequestURL());
				String str = "";
				while (params.hasMoreElements()) {
					String name = params.nextElement().toString();
					String[] value = req.getParameterValues(name);
					for (int i = 0; i < value.length; i++) {
						str = str + value[i];
					}
				}
				if (sqlValidate(str)) {
				//返回错误页面
				res.sendRedirect(req.getContextPath() + "/500.jsp");
				} else {
					chain.doFilter(req, res);
				}
	}

	// 效验
	protected static boolean sqlValidate(String str) {
		// 统一转为小写
		str = str.toLowerCase();
		System.out.println("防sql注入过滤:"+str);
		// 过滤掉的sql关键字,可以手动添加
		String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|"
				+ "char|declare|sitename|net user|xp_cmdshell|;|or|+|,|like'|and|exec|execute|insert|create|drop|"
				+ "table|from|grant|use|group_concat|column_name|"
				+ "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|"
				+ "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#|=|(|scrip";
		String[] badStrs = badStr.split("\\|");
		for (int i = 0; i < badStrs.length; i++) {
			if (str.indexOf(badStrs[i]) >= 0) {
				System.out.println(str+" ====触犯sql注入规则==》"+badStrs[i]);
				return true;
			}
		}
		return false;
	}
	public void destroy() {
		// throw new UnsupportedOperationException("Not supported yet.");
	}
}


(不缓存页面的过滤器 -有借鉴)

package com.patronli.servlet;


import java.io.IOException;
import java.util.Enumeration;

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 com.fuiou.fwp.util.ConfigReader;

       
       
/**   
* 用于的使 Browser 不缓存页面的过滤器   
*/       
public class patronliFilter implements Filter {         
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,ServletException  {        
        ((HttpServletResponse) response).setHeader("Cache-Control","no-cache");        
        ((HttpServletResponse) response).setHeader("Pragma","no-cache");        
        ((HttpServletResponse) response).setDateHeader ("Expires", -1);        
        filterChain.doFilter(request, response);        
    }        
           
    public void destroy() {        
    }        
           
    public void init(FilterConfig arg0) throws ServletException {        
    }        
}  

1
1
分享到:
评论

相关推荐

    web xml 详解

    以上示例中,我们定义了一个名为"My Web App"的Web应用,其中包含了一些基本信息(如显示名称、描述等),还定义了一个过滤器、监听器以及Servlet的映射关系。 #### 四、版本差异 需要注意的是,`web.xml` 文件的...

    spring中的所有配置

    这些过滤器可以被配置在`web.xml`中,与Servlet一样,通过`&lt;filter&gt;`和`&lt;filter-mapping&gt;`标签来定义。 至于容器,这里指的是Spring的IoC容器,它负责管理应用程序中的对象及其依赖关系。`WebApplicationContext`是...

    javaweb-demo

    - **Filter**:过滤器可以拦截请求和响应,进行预处理和后处理,比如登录验证、字符编码转换等。 - **Listener**:监听器监听特定事件,如会话创建、销毁、请求初始化等,可用来实现一些辅助功能。 7. **部署描述...

    jsp filter 过滤器功能与简单用法示例

    使用JSP过滤器的注意事项包括:确保过滤器的配置正确,避免在doFilter方法中引起循环引用或无限递归,合理使用过滤器链的调用顺序,以及正确配置web.xml文件以避免部署时出现错误。开发者在设计过滤器时应当尽量保证...

    ShareDemo.rar

    最后,为了确保应用能够接收到分享内容,还需要在AndroidManifest.xml文件中声明对应的Intent过滤器。通过设置标签,指定ACTION_VIEW和DATA类型,让系统知道我们的应用可以处理特定类型的分享内容。 总结来说,...

    SSM框架所做的一个登录的小demo

    `web.xml`则是Web应用的部署描述符,配置SpringMVC的DispatcherServlet和其他过滤器。 6. **注解的使用**:在SSM框架中,注解如@Controller、@Service、@Repository和@RequestMapping等被广泛使用,它们简化了XML...

    spring-shiro-demo

    1. **src/main/java** - 这里包含了项目的Java源代码,通常会有如`com.example.demo`这样的包结构,其中定义了Controller、Service、DAO层的类,以及Shiro的相关配置和过滤器。 2. **src/main/resources** - 存放...

    springboot-shiro-mybatis-demo.zip

    在`springboot-shiro-mybatis-demo`项目中,`pom.xml`需要引入SpringBoot、Shiro、MyBatis以及相关的依赖。例如,SpringBoot的启动器、Shiro的相关库、MyBatis的依赖以及MySQL驱动等。这些依赖使得我们可以快速地...

    Spring+Mybatis+Druid示例整合Demo2

    在Java Web开发中,Spring、Mybatis和Druid是常用的三大组件,它们分别负责控制层、持久层和数据源管理。本示例整合了这三者,旨在提供一个高效、稳定且易于维护的开发环境。下面将详细介绍这三个组件以及它们的整合...

    shiroDemo.rar

    《SpringBoot整合Shiro实现权限控制与登录验证详解》 在现代Web开发中,权限管理和安全验证是不可或缺的重要环节。本教程将详细讲解如何利用SpringBoot框架与Apache Shiro库结合,实现用户登录验证、记住密码功能,...

    shiro_demo.rar

    4. Filter:Shiro的过滤器链是实现Web安全的关键,如authc(认证)、perms(权限)、roles(角色)等过滤器,它们根据配置拦截特定的URL,并执行相应的安全逻辑。 四、实践示例 以一个简单的登录为例,当用户提交...

    springMVC security Demo

    **Spring MVC Security Demo详解** Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用程序提供了模型-视图-控制器(MVC)架构。而Spring Security则是一个强大的安全框架,用于处理Web应用程序的安全性,...

    Lucene常用的Demo

    `LuceneDemo`通常包含更复杂的例子,可能涉及多字段搜索、评分机制、过滤器以及排序等功能。这个示例可能涵盖了从数据源读取数据、创建索引、查询优化和结果处理的完整流程。学习此示例,可以帮助你理解如何利用`...

    log4j常用配置和Demo

    了解和掌握Log4j的常用配置对于Java开发人员来说至关重要,因为它可以帮助我们调试代码、追踪错误以及监控系统运行状态。下面,我们将深入探讨Log4j的基本概念、配置选项以及一个简单的Demo。 ### 1. Log4j基本概念...

    shiro整合ssmDemo可直接运行

    在Web应用的`web.xml`中,配置Shiro的过滤器链,设置`filter-mapping`以拦截所有请求。 #### 3.5 自定义Realm 创建自定义Realm,继承自`AuthorizingRealm`,重写`doGetAuthenticationInfo`和`...

    Cas入门demo以及SpringSecurity集成CasDemo

    这可以通过在web.xml中添加CAS过滤器和监听器来完成,这些组件会处理CAS服务的认证请求和响应。 3. **CAS登录流程** 用户首次访问受保护的资源时,会被重定向到CAS服务器进行身份验证。成功后,CAS服务器返回一个...

    Mina 使用DEMO

    **Mina 框架详解及DEMO演示** Apache Mina 是一款开源的网络通信框架,主要用于构建高性能、高效率的网络应用服务器。Mina 提供了一种抽象层,简化了网络编程,允许开发者专注于业务逻辑,而无需关心底层协议的实现...

    IDEASSM框架实战CRUDSSM整合配置MyBatis逆向工程.docx

    -- 字符编码过滤器 --&gt; &lt;filter-name&gt;CharacterEncodingFilter &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter &lt;param-name&gt;encoding &lt;param-value&gt;UTF-8 &lt;param-name&gt;...

    servlet-3_1-final.rar_java servlet3_servlet 3.1 demo

    此外,还提供了过滤器链来处理静态资源,减少了Servlet调用,提升了性能。 5. 增强的安全性 Servlet 3.1引入了更强大的安全特性,如HTTP Strict Transport Security(HSTS)和Content Security Policy(CSP),帮助...

    MVC和分页1

    过滤器可以设置优先级和参数,优先级用于确定过滤器的执行顺序,参数用于传递数据给过滤器。 过滤器的典型应用 过滤器的典型应用包括身份验证、日志记录、压缩响应等。 监听器的概念 监听器是Servlet规范中的一...

Global site tag (gtag.js) - Google Analytics