Servlet过滤器使用

合集下载

servlet过滤器工作原理

servlet过滤器工作原理

servlet过滤器工作原理
Servlet过滤器是Java Web应用程序中的一个组件,主要用于在请求到达Servlet之前或响应离开Servlet之前对请求或响应进行预
处理和后处理。

其工作原理可以分为以下几个步骤:
1. 过滤器包含了一个或多个过滤器链,每个过滤器链由多个过
滤器组成。

当一个请求到达Servlet容器时,容器会首先检查是否有
过滤器链与其对应。

2. 如果存在对应的过滤器链,则依次对请求进行预处理,如对
请求参数进行验证、对请求进行日志记录等操作。

3. 然后,过滤器链将处理后的请求传递给被过滤的Servlet,Servlet对请求进行处理并产生响应。

4. 当Servlet容器收到响应并准备发送到客户端时,它会遍历
响应所经过的过滤器链,依次对响应进行后处理,如对响应进行压缩、对响应进行加密等操作。

5. 最后,Servlet容器将处理后的响应发送到客户端。

总的来说,Servlet过滤器的作用是增强Java Web应用程序的安全性、可靠性和性能。

通过对请求和响应进行预处理和后处理,可以
有效地防范潜在的安全威胁,优化应用的性能,提高用户体验。

java 中filter过滤器使用方法

java 中filter过滤器使用方法

Java 中filter 过滤器的使用:Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。

它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应。

Filters 有许多的应用场合。

Servlet 2.3 规范建议如下的地方可以应用Filter:authentication filterslogging and auditing filtersimage conversion filtersdata compression filtersencryption filterstokenizing filtersfilters that trigger resource access eventsXSL/T filters that transform XML contentMIME-type chain filters如何实现一个过滤器呢?1.所在的类实现Filter接口public interface Filterpublic void init(FilterConfig filterConfig)throws ServletException过滤器初始化是在容器启动时自动初始化public void doFilter(ServletRequest request,ServletResponse response,FilterChainchain)throws IOException,ServletExcepton在标准Servlet中的doGet或doPost 方法中,传递参数为:HttpServletRequest、HttpServletResponse过滤器销毁public void destroy()例:如下为过滤器基本的主要结构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;public class MyFirstFilter implements Filter{private String encoding;public void destroy(){System.out.println("过滤器销毁");}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out .println("过滤doFilter");chain.doFilter(request, response);}public void init(FilterConfig filterConfig) throws ServletException {System.out .println("过滤器初始化"); encoding = filterConfig.getInitParameter("encoding"}对应配置文件:<filter ><filter-name >encodingFilter </filter-name ><filter-class >com.shen.test.filter. MyFirstFilter </filter-class ><init-param ><param-name >encoding </param-name ><param-value >Shift_JIS </param-value ></init-param ></filter ><filter-mapping ><filter-name >encodingFilter </filter-name ><servlet-name >action </servlet-name ></filter-mapping ><servlet ><init-param ><<param-value >/WEB-INF/config/struts-config.xml,/WEB-INF/config/st ruts-config-contents.xml </param-value ></init-param ><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><init-param><param-name>detail</param-name><param-value>2</param-value></init-param><load-on-startup>1</load-on-startup></servlet>如果过滤器要将内容传递到目的地,则需要FilterChain,将请求继续向下转发过滤器也会执行两次:FilterChain之前执行一次,之后再执行一次2:对某些文字进行过滤关键方法如下所示:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤doFilter");//从页面获取内容String content=request.getParameter("content");String filterchar ="色";if(content != null && !"".equals(content)){//如果indexOf返回-1则表示没有查到所要的内容if(-1 == content.indexOf(filterchar)){chain.doFilter(request, response);}else{System.out.println("有非法文字");//可以继续做处理//如果需要的话,此处依然可以使用RequestDispatcher进行跳转}}}3:设置统一编码/*** 对内容进行统一的编码*/request.setCharacterEncoding("GBK");response.setCharacterEncoding("GBK");4:登录验证:/*** 登陆验证*/public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {/*** 登陆验证*///Session属于http范畴,把以ServletRequest对象需要先转换成HttpServletRequest对象HttpServletRequest hrequest =(HttpServletRequest) request;HttpSession session =hrequest.getSession();//request.getScheme();request.getServerName();request.getServerPo rt();//如果session不为空,则可以浏览其它页面if(null != session.getAttribute("username")){chain.doFilter(request, response);}else{//通过requestDispatcher跳转到登陆面request.getRequestDispatcher("login.jsp").forward(request,respons e);}}第二部分:javax.servlet.Filter详细介绍:过滤器(Filter)位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。

servlet的基本运行流程

servlet的基本运行流程

Servlet的基本运行流程Servlet是Java Web中的一种技术,能够处理来自客户端的请求并生成响应。

它是在Web服务器上运行的Java类,可以与容器进行交互。

下面将详细描述Servlet的基本运行流程的步骤和流程。

1. Servlet的生命周期Servlet的生命周期包括以下三个阶段: - 初始化阶段(Initialization) - 服务阶段(Service) - 销毁阶段(Destroy)1.1 初始化阶段在Servlet类被加载到容器中时,(通常在Web应用程序启动时),容器会实例化Servlet对象,并调用其init()方法来进行初始化。

该方法只会在Servlet生命周期中被调用一次。

1.2 服务阶段一旦Servlet被初始化后,在其生命周期内,任何对Servlet的请求都会被容器处理。

当接收到一个客户端请求时,容器会创建一个新的线程,并调用Servlet的service()方法来处理该请求。

service()方法会根据请求的类型(GET、POST等)来调用相应的方法(如doGet()、doPost()等)进行处理。

1.3 销毁阶段当Web应用程序被关闭或Servlet容器被关闭时,容器会调用Servlet的destroy()方法来清除资源、释放内存和进行最后的操作,以完成Servlet的销毁过程。

2. Servlet运行流程Servlet的运行流程包括以下几个步骤:2.1 客户端发送请求当客户端(如浏览器)向Web服务器发送一个HTTP请求时,请求首先会到达Web容器。

2.2 容器寻找匹配的ServletWeb容器根据请求的URL来确定匹配的Servlet。

容器会维护一个Servlet映射表,将URL与对应的Servlet进行关联。

2.3 容器创建或获取Servlet实例如果Servlet实例不存在,则容器会创建一个新的Servlet实例,并调用其init()方法来进行初始化。

SpringMvcservlet拦截器过滤器关系和区别及执行顺序

SpringMvcservlet拦截器过滤器关系和区别及执行顺序

SpringMvcservlet拦截器过滤器关系和区别及执⾏顺序过滤器和拦截器的区别:1、过滤器是基于函数回调,拦截器是基于java的反射机制的。

2、过滤器是servlet规范规定的,只能⽤于web程序中,⽽拦截器是在spring容器中,它不依赖servlet容器。

3、过滤器可以拦截⼏乎所有的请求(包含对静态资源的请求),⽽拦截器只拦截action请求(不拦截静态资源请求)。

4、滤器不能访问action上下⽂、值栈⾥的对象,拦截器可以访问action上下⽂、值栈⾥的对象。

5、在action的⽣命周期中,过滤器只能在容器初始化时被调⽤⼀次,拦截器可以多次被调⽤,⽽。

6、拦截器可以获取IOC容器中的各个bean,⽽过滤器就不⾏,这点很重要,在拦截器⾥注⼊⼀个service,可以调⽤业务逻辑。

7、拦截器是被包裹在过滤器之中。

过滤器、拦截器、aop 顺序 拦截顺序:filter—>Interceptor—->@Aspect -->Interceptor)过滤器: 依赖于servlet容器。

在实现上基于函数回调,可以对⼏乎所有请求进⾏过滤,但是缺点是⼀个过滤器实例只能在容器初始化时调⽤⼀次。

使⽤过滤器的⽬的是⽤来做⼀些过滤操作,获取我们想要获取的数据,⽐如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的⼀些参数,包括:过滤低俗⽂字、危险字符等。

拦截器: 依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。

在实现上基于Java的反射机制,属于⾯向切⾯编程(AOP)的⼀种运⽤。

由于拦截器是基于web框架的调⽤,因此可以使⽤Spring的依赖注⼊(DI)进⾏⼀些业务操作,同时⼀个拦截器实例在⼀个controller⽣命周期之内可以多次调⽤。

但是缺点是只能对controller请求进⾏拦截,对其他的⼀些⽐如直接访问静态资源的请求则没办法进⾏拦截处理。

onceperrequestfilter的用法

onceperrequestfilter的用法

onceperrequestfilter的用法在Java Web开发中,Filter是一种常用的技术,用于在请求处理过程中执行特定的操作,例如验证用户身份、清理输出流等。

Filter按照它们的作用方式可以分为两种:过滤所有请求的过滤器和仅过滤特定请求的过滤器。

其中,OncePerRequestFilter是一种仅过滤特定请求的过滤器,它的用法对于一些特定的场景非常重要。

OncePerRequestFilter是一种特殊的过滤器,它只对每个请求执行一次。

这意味着,无论请求被多次调用,OncePerRequestFilter只执行一次。

这对于一些需要在请求处理过程中保持状态的场景非常有用,例如缓存某些结果或跟踪用户行为。

要使用OncePerRequestFilter,需要实现javax.servlet.Filter接口,并重写其doFilter方法。

在doFilter方法中,可以实现只执行一次请求的处理逻辑。

以下是一个简单的示例,展示了如何使用OncePerRequestFilter:```javaimport javax.servlet.*;import javax.servlet.http.HttpServletRequest;import java.io.IOException;public class OncePerRequestFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化方法,可以在这里进行一些配置}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 获取HttpServletRequest对象HttpServletRequest httpRequest = (HttpServletRequest) request;// 检查是否是第一次访问该请求if (!isFirstTime(httpRequest)) {// 如果不是第一次访问,直接将请求传递给下一个过滤器或Servlet处理chain.doFilter(request, response);return;}// 第一次访问时执行的处理逻辑,例如记录用户行为或缓存数据// ...// 将请求传递给下一个过滤器或Servlet处理chain.doFilter(request, response);}private boolean isFirstTime(HttpServletRequest request) { // 实现判断是否是第一次访问的逻辑,这里可以根据实际情况进行定制// 例如,可以记录请求的唯一标识符,并与之前访问的标识符进行比较String uniqueId = request.getHeader("UniqueId");return uniqueId == null|| !uniqueId.equals(getLastAccessedUniqueId(request));}private StringgetLastAccessedUniqueId(HttpServletRequest request) { // 实现获取上次访问的唯一标识符的逻辑,这里可以根据实际情况进行定制// 可以从数据库、缓存或其他数据源中获取该标识符return "123456"; // 示例值,实际应用中需要根据实际情况获取标识符}@Overridepublic void destroy() {// 销毁方法,可以在这里进行一些清理操作}}```上述示例中,OncePerRequestFilter实现了对特定请求的处理逻辑只执行一次。

06_使用Servlet过滤器

06_使用Servlet过滤器

PDF 文件使用 "pdfFactory" 试用版本创建
NoteFilter过滤器转发HTTP请求
当名叫“小精灵”的客户访 问留言簿时NoteFilter的工 作流程
日志文件位于
<CATALINA_HOME>\logs
目录下
PDF 文件使用 "pdfFactory" 试用版本创建
PDF 文件使用 "pdfFactory" 试用版本创建
NoteFilter过滤器拒绝HTTP请求
n
假定姓名中包含“捣蛋鬼”字符串的客户将 被禁止访问留言簿,并且留言簿由 NoteServlet 类 来 实 现 , 当 名 叫 “ 捣 蛋 鬼 2000”的客户访问留言簿时,将被 NoteFilter过滤器拒绝访问。
PDF 文件使用 "pdfFactory" 试用版lter的doFilter()方法中首先从request 对象中读取客户姓名,然后将客户姓名转换为 中文字符编码。如果客户姓名中包含黑名单里 的字符串,那么将直接向客户端返回一个拒绝 网页。由于在这种情况下没有调用 chain.doFilter()方法,因此客户请求不会到达 所访问的Web组件。
PDF 文件使用 "pdfFactory" 试用版本创建
发布Servlet过滤器
n
< filter-mapping> 元 素 用 于 将 过 滤 器 和 URL关联:
<filter-mapping> <filter-name>NoteFilter</filter-name> <url-pattern>/note</url-pattern> </filter-mapping>

servletfilter的执行顺序

servletfilter的执行顺序

servletfilter的执行顺序
Servlet Filter(过滤器)的执行顺序如下:
初始化过滤器:当应用程序启动时,容器会初始化所有配置的过滤器。

初始化过滤器的顺序是按照它们在web.xml 中的顺序来进行的。

请求到达过滤器链:当一个请求到达应用程序时,容器会将请求传递给第一个过滤器。

过滤器链中的过滤器执行:过滤器链是由多个过滤器组成的,它们按照web.xml中的顺序连接在一起。

每个过滤器都可以对请求进行处理,例如修改请求参数、验证用户身份等。

Servlet处理请求:当请求通过所有过滤器后,它将传递给目标Servlet进行处理。

响应返回过滤器链:当目标Servlet处理完请求并生成响应后,响应将通过过滤器链返回给客户端。

过滤器链中的过滤器执行(逆序):在响应返回过程中,过滤器将按照相反的顺序执行,即从最后一个过滤器到第一个过滤器。

这样可以对响应进行处理,例如添加响应头、修改响应内容等。

销毁过滤器:当应用程序关闭时,容器会销毁所有配置的过滤器。

销毁过滤器的顺序是按照它们在web.xml中的顺序来进行的。

需要注意的是,过滤器的执行顺序是由web.xml中的配
置决定的。

如果你在web.xml中配置了多个过滤器,并且希望它们按照特定的顺序执行,你需要确保在配置文件中按照期望的顺序列出它们。

web filter处理流程

web filter处理流程

Web过滤器的处理流程通常包括以下几个关键步骤:
1.初始化阶段:当Web容器启动时,过滤器会被创建并初始化。


这个阶段,过滤器可以读取配置参数,获取`FilterConfig`对象,并进行一些初始化操作。

2.请求预处理阶段:在请求到达Servlet之前,过滤器可以对请求进
行预处理。

这个环节常用于执行如日志记录、权限验证、字符编码设置等操作。

3.Servlet执行阶段:经过过滤器预处理后,请求会被传递给目标
Servlet进行处理。

如果存在多个过滤器,那么这些过滤器会按照它们在配置文件中的顺序依次执行。

4.响应后处理阶段:在Servlet生成响应之后,过滤器还可以对服务
器的响应进行后处理。

例如,可以对输出的内容进行压缩或者添加额外的头部信息。

5.销毁阶段:在Web容器关闭时,过滤器会被销毁。

在这个阶段,
可以进行资源的清理工作。

需要注意的是,在编写过滤器时,需要实现`javax.servlet.Filter`接口,并重写其中的`doFilter`方法。

该方法接收`ServletRequest`、`ServletResponse`和`FilterChain`三个参数,分别代表请求、响应和过滤器链。

在`doFilter`方法中,可以编写预处理和后处理的逻辑代码。

此外,还需要通过注解`@WebFilter`或者在`web.xml`文件中配置过滤器的映射信息,以指定过滤器应用于哪些URL模式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
过滤器的链式结构
可以为一个Web应用组件部署多个过滤器,这些过滤器组成一个过滤器链,每个过滤器只执行某个特定的操作或者检查。这样请求在到达被访问的目标之前,需要经过这个过滤器链。
实现过滤器
在Web应用中使用过滤器需要实现javax.servlet.Filter接口,实现Filter接口中所定义的方法,并在web.xml中部署过滤器。
Servlet过滤器使用(javax.servlet.Filter)(本教程仅供研究和学习,不代表JAVA中文网观点)
本篇文章链接地址:/architecture/servlet/101950.shtml
如需转载请注明出自JAVA中文网:/
//在这里可以对客户端请求进行检查
//沿过滤器链将请求传递到下一个过滤器。
chain.doFilter(request, response);
//在这里可以对响应进行处理
}
public void destroy( ) {
//过滤器被销毁时执行的代码
}
}
Filter接口
public void init(FilterConfig config)
public class MyFilter implements Filter {
public void init(FilterConfig fc) {
//过滤器初始化代码
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
web容器调用本方法,说明过滤器正被加载到web容器中去。容器只有在实例化过滤器时才会调用该方法一次。容器为这个方法传递一个FilterConfig对象,其中包含与Filter相关的配置信息。
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
<filter-class>
.uibe.webdev.MyFilter
</filter-class>
<init-param>
<param-name>developer</param-name>
<param-value>TongQiang</param-value>
</init-param>
每当请求和响应经过过滤器链时,容器都要调用一次该方法。需要注意的是过滤器的一个实例可以同时服务于多个请求,特别需要注意线程同步问题,尽量不用或少用实例变量。在过滤器的doFilter()方法实现中,任何出现在FilterChain的doFilter方法之前地方,request是可用的;在doFilter()方法之后response是可用的。
<filter-name>MyFilter</filter-name>
<url-pattern>/book/*</url-pattern>
</filter-mapping>
<filter-mapping>标记是有先后顺序的,它的声明顺序说明容器是如何形成过滤器链的。过滤器应当设计为在部署时很容易配置的形式。通过认真计划和使用初始化参数,可以得到复用性很高的过滤器。过滤器逻辑与Servlet逻辑不同,它不依赖于任何用户状态信息,因为一个过滤器实例可能同时处理多个完全不同的请求。
在请求到达Servlet/JSP之前,过滤器截获请求。
在响应送给客户端之前,过滤器截获响应。
多个过滤器形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射<filter-mapping>的顺序决定。
最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。
本篇文章来自Java中文网:/architecture/servlet/101950.shtml
public void destroy()
容器调用destroy()方法指出将从服务中删除该过滤器。如果过滤器使用了其他资源,需要在这个方法中释放这些资源。
部署过滤器
在Web应用的WEB-INF目录下,找到web.xml文件,在其中添加如下代码来声明Filter。
<filter>
<filter-name>MyFilter</filter-name>
</filter>
针对一个Servlet做过滤
<filter-mapping>
<filter-name>MyFilter</filter-name>
<servlet-name>MyServlet</servlet-name>
</filter-mapping>
针对URL Pattern做过滤
<filter-mapping>
Servlet过滤器使用(javax.servlet.Filter)作者:本站原创发布时间:2010-06-10来源:JAVA中文网点我投稿
教程由JAVA中文网整理校对发布()
过滤器(Filter)的概念
过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。
相关文档
最新文档