概述:

过滤器是Servlet2.3以上新添加的一个功能,其技术也是很强大的。通过Filter技术能够对WEBserver的文件进行拦截,从而实现一些特殊的功能。

在JSP开发应用中也是必备的技能之中的一个。

Filter能够改变一个request(请求)和改动一个response(响应)。Filter不是一个Servlet,它不能产生一个response,它能够在一个requsst到达Servlet之前预处理request,也能够在离开Servlet时处理response。

原理:

当Web容器接受到一个对资源的请求时。它将推断是否有过滤器与这个资源关联。假设有的话容器把请求交给过滤器处理,在过滤器中,能够改变请求的内容,或者又一次设置请求的信息,然后再将请求发送给目标资源,当目标资源对请求做出响应后,容器相同将响应先转发给过滤器,过滤器能够对响应的内容进行转换,然后再将响应发送到client

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2pyMTUyMzM2NjExNDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

在一个Web应用中,是能够部署多个过滤器的。组成一个过滤器链。过滤器链中的每一个过滤器负责特定的操作和任务,client的请求在这些过滤器之间传递,直到目标资源。WEBserver依据Filter在web.xml文件里的注冊顺序决定先调用哪一个Filter,当地一个Filter的doFilter方法被调用时,WEBserver会创建一个Filter链的FilterChain对象传递给该方法。

说明:FIlter不是一个标准的Servlet,不能处理用户请求,也不能对client生成响应。

主要用于对HttpServletRequest进行预处理,也能够对HttpServletResponse进行后处理。

HttpServletRequest和HttpServletResponse工作流程

首先,在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest,然后依据须要检查HttpServletRequest,也能够改动HttpServletRequest头和数据,当HttpServletResponse到达client之前。拦截HttpServletResponse,依据须要检查HttpServletResponse。也能够改动HttpServletResponse的头和数据。

比方说当对用户发送的数据进行过滤,替换时就使用到这一点。

Filter使用基础

1.一个Filter必须实现javax.servlet,Filter接口并定义下面三个方法:

<!--Filter实例化后进行初始化的回调方法-->

public void init(FilterConfig config)

<!--处理过滤器的方法-->

public void doFilter(ServletRequest  request,ServletResponse response,FilterChain)

<!--在释放时回调的方法-->

public void destory()

2.FilterConfig接口

在配置filter时,能够使用<init-parm>为filter配置一些初始化參数,当web容器实例化Filter对象时。调用init方法时,会把封装了filter初始化參数的filterConfig对象传递进来,因此在编写filter时,通过filterConfig对象的方法,就能够通过getFilterName()获得filter的名字,使用String
getInitParamerter(String name)获得在部署描写叙述中指定名称的初始化參数的值等

3.在web.xml文件里使用<filter>和<filter-mapping>元素对编写的filter类进行注冊。并设置它所能拦截的资源。

以下通过介绍登陆的时加上过滤器这个样例介绍web.xml怎么配置

Web.xml

<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.action.login.SessionFilter</filter-class>
<init-param>
<param-name>logonStrings</param-name><!-- 对登录页面不进行过滤 -->
<param-value>/project/index.jsp;login.do</param-value>
</init-param>
<init-param>
<param-name>includeStrings</param-name><!-- 仅仅对指定过滤參数后缀进行过滤 -->
<param-value>.do;.jsp</param-value>
</init-param>
<init-param>
<param-name>redirectPath</param-name><!-- 未通过跳转到登录界面 -->
<param-value>/index.jsp</param-value>
</init-param>
<init-param>
<param-name>disabletestfilter</param-name><!-- Y:过滤无效 -->
<param-value>N</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

FilterServlet

package com.action.login;

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.HttpServletResponseWrapper; <!-- 推断用户是否登录,未登录则退出系统返回登陆页-->
public class SessionFilter implements Filter { public FilterConfig config; public void destroy() {
this.config = null;
} public static boolean isContains(String container, String[] regx) {
boolean result = false; for (int i = 0; i < regx.length; i++) {
if (container.indexOf(regx[i]) != -1) {
return true;
}
}
return result;
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest hrequest = (HttpServletRequest)request;
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response); String logonStrings = config.getInitParameter("logonStrings"); <!--登录登陆页面-->
String includeStrings = config.getInitParameter("includeStrings"); <!--过滤资源后缀參数-->
String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");<!--没有登陆转向页面-->
String disabletestfilter = config.getInitParameter("disabletestfilter");<!-- 过滤器是否有效--> if (disabletestfilter.toUpperCase().equals("Y")) { <!--过滤无效-->
chain.doFilter(request, response);
return;
}
String[] logonList = logonStrings.split(";");
String[] includeList = includeStrings.split(";"); if (!this.isContains(hrequest.getRequestURI(), includeList)) {<!--仅仅对指定过滤參数后缀进行过滤-->
chain.doFilter(request, response);
return;
} if (this.isContains(hrequest.getRequestURI(), logonList)) {<!--对登录页面不进行过滤-->
chain.doFilter(request, response);
return;
} String user = ( String ) hrequest.getSession().getAttribute("useronly");<!--推断用户是否登录-->
if (user == null) {
wrapper.sendRedirect(redirectPath);
return;
}else {
chain.doFilter(request, response);
return;
}
} public void init(FilterConfig filterConfig) throws ServletException {
config = filterConfig;
}
}

这样FIlter就能够帮你过滤了。

        总结:上篇文章简单对拦截器有一个了解,今天 又学习了FIlter这个过滤器。除了用法不一样以外它们还有非常多不同的地方,如:filter基于回调函数。我们须要实现的filter接口中doFilter方法就是回调函数。而interceptor则基于java本身的反射机制,这是两者最本质的差别,filter是依赖于servlet容器的。即仅仅能在servlet容器中运行,非常显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关。还有就是拦截器由spring管理,仅仅对action起作用,不能拦截jsp页面、图片等其它资源。

拦截器截获用户对action的訪问,如须要跳转,仅仅需如action一样返回一个result,spring依据result的配置运行跳转。如无需跳转。可调用invocation.invoke();方法来运行用户请求的action。拦截器在action之前開始,在action完毕后结束。肯定还有非常多不同的地方,学习到这里仅仅体会到了这些。欢迎大家一起分享。

SSH2——filter过滤器的更多相关文章

  1. filter 过滤器(监听)

    Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...

  2. Java防止SQL注入2(通过filter过滤器功能进行拦截)

    首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...

  3. Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  4. javaweb学习总结(四十二)——Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  5. Filter过滤器简单应用( 接口访问控制 )

    一.描述 在提供安卓.IOS客户端接口时,可以在登陆接口分配Session给客户端,用于判断其他接口是否是合法访问,以避免将所有的接口都暴露在web中可以由路径直接访问.但是最近的一个项目中的移动接口 ...

  6. 如何配置Filter过滤器处理JSP中文乱码

    参考Tomcat服务器目录webapps的examples示例 简单配置步骤:1.在项目web.xml文件添加过滤器标记<filter>和<filter-mapping>:2. ...

  7. Filter(过滤器)常见应用

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十六)——Filter(过滤器)常见应用 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html F ...

  8. Filter过滤器(1)

    Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ht ...

  9. Servlet的学习之Filter过滤器技术(1)

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

随机推荐

  1. 问题:编译eshoponcontainers失败,提示error:invalid reference format

    环境: visual studio 2017 v15.4.2,docker ce Version 17.06.0-ce-win19 (12801) 参考问题页: https://github.com/ ...

  2. selenim之ActionChains(一)

    大家好,来介绍下,今天要分享的是小编学ActionChains的经验. 先来说一下今天要用到的方法: click(element=null)                               ...

  3. java获取当前上一周、上一月、上一年的时间

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calend ...

  4. RestSharp使用总结

    RestSharp是一个轻量的,不依赖任何第三方的组件或者类库的Http的组件.RestSharp具有以下的优点:   1.支持.NET 3.5+,Silverlight 4, Windows Pho ...

  5. 基于HTML5的WebGL经典3D虚拟机房漫游动画

    第一人称在 3D 中的用法要参考第一人称在射击游戏中的使用,第一人称射击游戏(FPS)是以第一人称视角为中心围绕枪和其他武器为基础的视频游戏类型 ; 也就是说,玩家通过主角的眼睛来体验动作.自从流派开 ...

  6. Python 直接赋值、浅拷贝和深度拷贝解析

    直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象 ...

  7. C#值参数和引用参数

    一.值参数 未用ref或out修饰符声明的参数为值参数. 使用值参数,通过将实参的值复制到形参的方式,把数据传递到方法.方法被调用时,系统做如下操作. 在栈中为形参分配空间. 复制实参到形参. 值参数 ...

  8. asp.net web api 构建api帮助文档

    1 概要 创建ASP.NET Web Api 时模板自带Help Pages框架. 2 问题 1)使用VS创建Web Api项目时,模板将Help Pages框架自动集成到其中,使得Web Api项目 ...

  9. let and const

    let 和 const 命令 let 命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; v ...

  10. LINQ学习系列-----1.3 扩展方法

    这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性.    一.扩展方法介绍   废话不多说,先上源码截图: 上图中Ge ...