Servlet过滤器使用
- 格式:doc
- 大小:26.00 KB
- 文档页数:3
servlet过滤器工作原理
Servlet过滤器是Java Web应用程序中的一个组件,主要用于在请求到达Servlet之前或响应离开Servlet之前对请求或响应进行预
处理和后处理。
其工作原理可以分为以下几个步骤:
1. 过滤器包含了一个或多个过滤器链,每个过滤器链由多个过
滤器组成。
当一个请求到达Servlet容器时,容器会首先检查是否有
过滤器链与其对应。
2. 如果存在对应的过滤器链,则依次对请求进行预处理,如对
请求参数进行验证、对请求进行日志记录等操作。
3. 然后,过滤器链将处理后的请求传递给被过滤的Servlet,Servlet对请求进行处理并产生响应。
4. 当Servlet容器收到响应并准备发送到客户端时,它会遍历
响应所经过的过滤器链,依次对响应进行后处理,如对响应进行压缩、对响应进行加密等操作。
5. 最后,Servlet容器将处理后的响应发送到客户端。
总的来说,Servlet过滤器的作用是增强Java Web应用程序的安全性、可靠性和性能。
通过对请求和响应进行预处理和后处理,可以
有效地防范潜在的安全威胁,优化应用的性能,提高用户体验。
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是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拦截器过滤器关系和区别及执⾏顺序过滤器和拦截器的区别: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的用法在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实现了对特定请求的处理逻辑只执行一次。
servletfilter的执行顺序
Servlet Filter(过滤器)的执行顺序如下:
初始化过滤器:当应用程序启动时,容器会初始化所有配置的过滤器。
初始化过滤器的顺序是按照它们在web.xml 中的顺序来进行的。
请求到达过滤器链:当一个请求到达应用程序时,容器会将请求传递给第一个过滤器。
过滤器链中的过滤器执行:过滤器链是由多个过滤器组成的,它们按照web.xml中的顺序连接在一起。
每个过滤器都可以对请求进行处理,例如修改请求参数、验证用户身份等。
Servlet处理请求:当请求通过所有过滤器后,它将传递给目标Servlet进行处理。
响应返回过滤器链:当目标Servlet处理完请求并生成响应后,响应将通过过滤器链返回给客户端。
过滤器链中的过滤器执行(逆序):在响应返回过程中,过滤器将按照相反的顺序执行,即从最后一个过滤器到第一个过滤器。
这样可以对响应进行处理,例如添加响应头、修改响应内容等。
销毁过滤器:当应用程序关闭时,容器会销毁所有配置的过滤器。
销毁过滤器的顺序是按照它们在web.xml中的顺序来进行的。
需要注意的是,过滤器的执行顺序是由web.xml中的配
置决定的。
如果你在web.xml中配置了多个过滤器,并且希望它们按照特定的顺序执行,你需要确保在配置文件中按照期望的顺序列出它们。
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模式。
filter过滤器原理Filter过滤器是Java Servlet规范中的一个重要组成部分,它主要用于Web应用程序中对请求或响应进行一些处理或修改。
Filter过滤器能够拦截客户端请求和响应,并对其进行一些预处理或后处理,同时不对底层资源进行任何的改变。
在Web应用程序中,客户端的请求会按照一定的顺序被多个过滤器拦截,最后才会到达目标Servlet或JSP页面。
过滤器的拦截顺序是由web.xml文件中的顺序决定的,顺序越靠前的过滤器越先拦截请求。
Filter过滤器的工作过程可以用下面的流程来描述:1、当客户端发起请求时,服务器会根据客户端请求的URL找到相应的Servlet或JSP 页面。
2、在Servlet或JSP页面被执行之前,在过滤器链中的第一个过滤器会被调用。
这个过滤器可以实现一些真正的过滤操作,比如验证用户身份等。
3、当第一个过滤器完成处理后,请求会按照web.xml文件中定义的顺序,依次经过它后面的过滤器。
4、如果过滤器链中有多个过滤器,请求将根据它们的顺序进行处理。
当请求到达最后一个过滤器时,如果没有被任何一个过滤器拦截,则将请求传递给目标Servlet或JSP 页面。
5、在Servlet或JSP页面处理请求并生成响应后,响应会按照相反的顺序经过过滤器链中的过滤器进行处理或修改,最终响应到达客户端。
通过使用Filter过滤器,可以有效的将Web应用程序的功能模块拆分成多个独立的模块,这些模块可以按照一定的顺序调用,扩展或修改Web应用程序的行为。
具体的优点包括:1、实现模块可复用性:在一个应用程序中,多个模块可能会需要进行相同或相似的过滤操作,而使用Filter可以将这些操作独立出来,易于重复使用。
2、抽象控制流:通过使用Filter可以抽象出整个请求和响应的控制流,实现更细粒度的控制。
3、有效的处理URL:通过Filter可以有效的处理URL,实现URL的解析和路由处理。
4、可扩展性:在Web应用程序中,Filter可以很方便的进行增加、删除或修改,从而实现Web应用程序的功能扩展。
过滤器、拦截器应⽤场景、区别和使⽤
应⽤场景
过滤器的应⽤:字符编码转换,敏感词过滤、登陆权限验证、资源访问权限等
拦截器的应⽤:AOP、需要有⼀些业务逻辑(需要注⼊Bean等)
区别
1. 过滤器配置再web.xml中、拦截器配置springmvc的配置⽂件中(即在DispatcherServlet的contextConfigLocation属性指定⽂件所在位
置,默认加载的是:/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml))
2. 过滤器基于函数回调、拦截器基于反射
3. 过滤器⼏乎对所有请求起作⽤,拦截器只对⽬标执⾏⽅法(action⽅法)起作⽤
4. 过滤器:对请求进⾏预处理、再交给Servlet处理并且⽣成响应,最后Filter再对服务器响应进⾏后处理
拦截器:可以再⽅法执⾏前调⽤(preHandle)、⽅法执⾏后(postHandle)、视图页⾯渲染后(afterCompletion)
执⾏流程
过滤器初始化-》(客户端请求过来)dofilter处理请求-》到达dispatchServlet,在⽬标⽅法执⾏前preHandle-》(放⾏,返回true)执⾏⽬标⽅法-》(正常返回,异常则不执⾏)postHandle-》(⽆论⽬标⽅法是否执⾏或者执⾏是否出现异常,都会执⾏)afterCompletion-》dofilter 处理响应-》客户端加载页⾯。