- 浏览: 5280 次
- 性别:
- 来自: 北京
文章分类
最新评论
过滤器的生命周期:
1、实例化
通过web.xml配置,web容器启动时就会加载过滤器,实例化只会实例化一次。Servlet3.0规范中新增了@WebFilter的方式,这种方式用于讲一个类声明为过滤器,该注解将会在部署时被web容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。
2、初始化
调用过滤器的init(),这是过滤器的初始化方法,web容器创建过滤器实例后将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数。
3、过滤方法
每次请求都会调用过滤器的doFilter(),这个方法完成实际的过滤操作。这个是过滤器的核心方法,当用户请求访问与过滤器关联的URL时,web容器将先调用过滤器的doFilter()。FilterChain参数可以调用chain.doFilter(),将请求传递给下一个过滤器(或目标资源),或利用转发,重定向将请求转发到其他资源。
4、销毁
当web容器在销毁过滤器实例前调用destroy(),在这个方法中可以释放过滤器占用的资源。
过滤器的分类:
指定过滤器的转发模式,对应filter中的dispatchTypes属性,具体属性值包括以下5个,其中Servlet2.5支持REQUEST、FORWARD、INCLUDE、ERROR,Servlet3.0新增ASYNC
1、REQUEST
用户直接访问页面时,web容器将会调用过滤器,过滤器的默认种类。
2、FORWARD
目标资源是通过RequestDispatch的forward访问时,该过滤器将被调用。
3、INCLUDE
目标资源是通过RequestDispatch的include访问时,该过滤器将被调用。
4、ERROR
目标资源是通过声明式异常处理机制调用时,过滤器将被调用。
5、ASYNC
支持异步处理
过滤器示例:
web.xml
login.jsp
success.jsp
failure.jsp
LoginServlet.java
LoginFilter.java
EncodingFilter.java
Servlet3.0特性:
Servlet3.0支持注解的方式注册servlet和filter,我们不需要在web.xml中配置servlet和filter,只需要在servlet和filter类中用@方式注入即可,代码如下:
LoginServlet.java
LoginFilter.java
EncodingFilter.java
LoginServlet.java
这样的配置等同web.xml中的配置
LoginFilter.java
这样的配置等同web.xml中的配置
EncodingFilter.java
这样的配置等同web.xml中的配置
Servlet3.0过滤器执行顺序:
Servlet3.0之前Filter过滤的顺序是由用户在web.xml中配置的顺序决定的,如我们的程序会先执行LoginFilter,再执行encodingFilter。
在3.0之后新增@WebFilter注解,当使用注解配置多个Filter时,用户无法控制其执行顺序,此时Filter过滤的顺序是按照Filter的类名来控制的,按自然排序的规则。LoginFilter.java 和 EncodingFilter.java 这两个文件里面分别是“用户登录过滤器”和“字符集过滤器”,因为这两个文件的首字母E排L之前,导致每次执行的时候都是先执行“字符集过滤器”再执行“用户登录过滤器”,所以我们现在修改两个文件的名称分别为
Filter0_EncodingFilter.java
Filter1_LoginFilter.java
这样就能先执行“用户登录过滤器”再执行“字符集过滤器”。
1、实例化
通过web.xml配置,web容器启动时就会加载过滤器,实例化只会实例化一次。Servlet3.0规范中新增了@WebFilter的方式,这种方式用于讲一个类声明为过滤器,该注解将会在部署时被web容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。
2、初始化
调用过滤器的init(),这是过滤器的初始化方法,web容器创建过滤器实例后将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数。
3、过滤方法
每次请求都会调用过滤器的doFilter(),这个方法完成实际的过滤操作。这个是过滤器的核心方法,当用户请求访问与过滤器关联的URL时,web容器将先调用过滤器的doFilter()。FilterChain参数可以调用chain.doFilter(),将请求传递给下一个过滤器(或目标资源),或利用转发,重定向将请求转发到其他资源。
4、销毁
当web容器在销毁过滤器实例前调用destroy(),在这个方法中可以释放过滤器占用的资源。
过滤器的分类:
指定过滤器的转发模式,对应filter中的dispatchTypes属性,具体属性值包括以下5个,其中Servlet2.5支持REQUEST、FORWARD、INCLUDE、ERROR,Servlet3.0新增ASYNC
1、REQUEST
用户直接访问页面时,web容器将会调用过滤器,过滤器的默认种类。
2、FORWARD
目标资源是通过RequestDispatch的forward访问时,该过滤器将被调用。
3、INCLUDE
目标资源是通过RequestDispatch的include访问时,该过滤器将被调用。
4、ERROR
目标资源是通过声明式异常处理机制调用时,过滤器将被调用。
5、ASYNC
支持异步处理
过滤器示例:
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <filter> <filter-name>loginFilter</filter-name> <filter-class>com.pumpkin.filter.LoginFilter</filter-class> <init-param> <param-name>unfilteredPaths</param-name> <param-value>login.jsp;failure.jsp;login</param-value> </init-param> </filter> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.pumpkin.filter.EncodingFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.pumpkin.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Filter实例</title> </head> <body> <% System.out.println("===login.jsp==="); %> <form action="login" method="post"> 用户名:<input type="text" name="username"/> <br/> 密码:<input type="password" name="password"/> <br/> <input type="submit" value="提交"/> </form> </body> </html>
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>成功页面</title> </head> <body> <% System.out.println("===success.jsp==="); %> ${username},登陆成功! </body> </html>
failure.jsp
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2017/6/17 Time: 22:47 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>失败页面</title> </head> <body> <% System.out.println("===failure.jsp==="); %> 登录失败! </body> </html>
LoginServlet.java
package com.pumpkin.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; public class LoginServlet extends HttpServlet { public LoginServlet() { super(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("===LoginServlet===doGet==="); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("===LoginServlet===doPost===start==="); String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("===username===" + username + "==="); if ("admin".equals(username) && "admin".equals(password)) { HttpSession session = req.getSession(); session.setAttribute("username",username); resp.sendRedirect(req.getContextPath() + "/success.jsp"); }else { resp.sendRedirect(req.getContextPath() + "/failure.jsp"); } System.out.println("===LoginServlet===doPost===end==="); } }
LoginFilter.java
package com.pumpkin.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.logging.Filter; public class LoginFilter implements javax.servlet.Filter { private FilterConfig config; @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("===LoginFilter===init==="); config = filterConfig; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("===LoginFilter===doFilter===start==="); HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); String unfilteredPaths = config.getInitParameter("unfilteredPaths"); if (unfilteredPaths != null) { String[] strArray = unfilteredPaths.split(";"); for (int i = 0; i < strArray.length; i++) { if (strArray[i] == null || "".equals(strArray[i])) { continue; } if (request.getRequestURI().indexOf(strArray[i]) != -1) { filterChain.doFilter(request, response); return; } } } if (session.getAttribute("username") != null) { filterChain.doFilter(request, response); } else { response.sendRedirect("login.jsp"); } System.out.println("===LoginFilter===doFilter===end==="); } @Override public void destroy() { System.out.println("===LoginFilter===destroy==="); } }
EncodingFilter.java
package com.pumpkin.filter; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpExchange; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import java.io.IOException; public class EncodingFilter implements javax.servlet.Filter{ private FilterConfig config; @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("===EncodingFilter===init==="); config = filterConfig; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("===EncodingFilter===doFilter===start==="); String charset = config.getInitParameter("charset"); if (charset == null) { charset = "UTF-8"; } servletRequest.setCharacterEncoding(charset); filterChain.doFilter(servletRequest,servletResponse); System.out.println("===EncodingFilter===doFilter===end==="); } @Override public void destroy() { System.out.println("===EncodingFilter===destroy==="); } }
Servlet3.0特性:
Servlet3.0支持注解的方式注册servlet和filter,我们不需要在web.xml中配置servlet和filter,只需要在servlet和filter类中用@方式注入即可,代码如下:
LoginServlet.java
package com.pumpkin.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet(name = "LoginServlet",urlPatterns = "/login") public class LoginServlet extends HttpServlet { public LoginServlet() { super(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("===LoginServlet===doGet==="); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("===LoginServlet===doPost===start==="); String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("===username===" + username + "==="); if ("admin".equals(username) && "admin".equals(password)) { HttpSession session = req.getSession(); session.setAttribute("username",username); resp.sendRedirect(req.getContextPath() + "/success.jsp"); }else { resp.sendRedirect(req.getContextPath() + "/failure.jsp"); } System.out.println("===LoginServlet===doPost===end==="); } }
LoginFilter.java
package com.pumpkin.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.logging.Filter; @WebFilter(filterName = "Filter1_LoginFilter", value = {"/*"}, initParams = {@WebInitParam(name = "unfilteredPaths", value = "login.jsp;failure.jsp;login")}) public class LoginFilter implements javax.servlet.Filter { private FilterConfig config; @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("===LoginFilter===init==="); config = filterConfig; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("===LoginFilter===doFilter===start==="); HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); String unfilteredPaths = config.getInitParameter("unfilteredPaths"); if (unfilteredPaths != null) { String[] strArray = unfilteredPaths.split(";"); for (int i = 0; i < strArray.length; i++) { if (strArray[i] == null || "".equals(strArray[i])) { continue; } if (request.getRequestURI().indexOf(strArray[i]) != -1) { filterChain.doFilter(request, response); return; } } } if (session.getAttribute("username") != null) { filterChain.doFilter(request, response); } else { response.sendRedirect("login.jsp"); } System.out.println("===LoginFilter===doFilter===end==="); } @Override public void destroy() { System.out.println("===LoginFilter===destroy==="); } }
EncodingFilter.java
package com.pumpkin.filter; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpExchange; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import java.io.IOException; @WebFilter(filterName = "Filter0_EncodingFilter", value = {"/*"}, initParams = {@WebInitParam(name = "charset", value = "UTF-8")}) public class EncodingFilter implements javax.servlet.Filter{ private FilterConfig config; @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("===EncodingFilter===init==="); config = filterConfig; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("===EncodingFilter===doFilter===start==="); String charset = config.getInitParameter("charset"); if (charset == null) { charset = "UTF-8"; } servletRequest.setCharacterEncoding(charset); filterChain.doFilter(servletRequest,servletResponse); System.out.println("===EncodingFilter===doFilter===end==="); } @Override public void destroy() { System.out.println("===EncodingFilter===destroy==="); } }
LoginServlet.java
@WebServlet(name = "LoginServlet",urlPatterns = "/login")
这样的配置等同web.xml中的配置
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.pumpkin.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
LoginFilter.java
@WebFilter(filterName = "Filter1_LoginFilter", value = {"/*"}, initParams = {@WebInitParam(name = "unfilteredPaths", value = "login.jsp;failure.jsp;login")})
这样的配置等同web.xml中的配置
<filter> <filter-name>loginFilter</filter-name> <filter-class>com.pumpkin.filter.LoginFilter</filter-class> <init-param> <param-name>unfilteredPaths</param-name> <param-value>login.jsp;failure.jsp;login</param-value> </init-param> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
EncodingFilter.java
@WebFilter(filterName = "Filter0_EncodingFilter", value = {"/*"}, initParams = {@WebInitParam(name = "charset", value = "UTF-8")})
这样的配置等同web.xml中的配置
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.pumpkin.filter.EncodingFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Servlet3.0过滤器执行顺序:
Servlet3.0之前Filter过滤的顺序是由用户在web.xml中配置的顺序决定的,如我们的程序会先执行LoginFilter,再执行encodingFilter。
在3.0之后新增@WebFilter注解,当使用注解配置多个Filter时,用户无法控制其执行顺序,此时Filter过滤的顺序是按照Filter的类名来控制的,按自然排序的规则。LoginFilter.java 和 EncodingFilter.java 这两个文件里面分别是“用户登录过滤器”和“字符集过滤器”,因为这两个文件的首字母E排L之前,导致每次执行的时候都是先执行“字符集过滤器”再执行“用户登录过滤器”,所以我们现在修改两个文件的名称分别为
Filter0_EncodingFilter.java
Filter1_LoginFilter.java
这样就能先执行“用户登录过滤器”再执行“字符集过滤器”。
相关推荐
浅谈基于过滤器与拦截器的用户访问控制,stuts2中拦截器和过滤器的应用
白细胞过滤器利用特定的滤材和过滤技术,有效地从血液中移除白细胞,从而减少了与白细胞相关的不良反应的发生,如输血引起的移植物抗宿主病和病毒传播的风险。 在临床实践中,正确使用白细胞过滤器能够显著提高输血...
在Spring MVC中,有两种常见的机制可以用来对访问的URL进行拦截处理:拦截器(Interceptor)和过滤器(Filter)。这两者都可以实现预处理和后处理功能,但它们的工作方式和应用场景有所不同。 ### 拦截器...
在本文中,我们将深入探讨SpringMVC的拦截器(Interceptor)和Servlet的过滤器(Filter)之间的差异和联系,以及如何配置SpringMVC的拦截器。理解这两者的区别对于开发高效且安全的Web应用程序至关重要。 首先,让我们...
3. **信号筛选与噪声过滤**:电感可以用于选择特定频率范围内的信号,并过滤掉不希望存在的噪声信号。这种功能在通信系统、音频处理等领域中非常重要。 4. **稳定电流**:电感还具有平滑电流波动的作用,在电源电路...
5. **维护与保养**:定期检查和清理空调器的各个部件,特别是过滤器,以保持其工作效率和延长使用寿命。 总之,这篇论文深入介绍了特定环境下空调器的工作原理,为船舶医疗区的空调设备管理和维修提供了专业指导,...
与传统汽车的空气滤清器相比,FCEV的空气滤清器需要更高的过滤效率和更大的过滤面积。这是因为燃料电池对空气质量要求更为严格,任何微小的颗粒都可能影响燃料电池的性能和寿命。此外,由于氢燃料电池的工作温度相对...
本文将探讨两种主要的解决乱码问题的策略,分别是针对MySQL数据库的设置调整和Web应用程序中的编码过滤器。 首先,对于MySQL数据库出现的乱码问题,我们需要关注数据库的字符集设置。MySQL默认可能使用的是`latin1`...
**Java中的Filter过滤器详解** Java中的Filter过滤器是Servlet技术的一个重要组成部分,它允许开发者在请求到达Servlet之前以及响应返回客户端之前进行拦截处理。这种技术广泛应用于Web应用程序中,可以实现诸如...
这篇“缓存技术浅谈”可能是一篇深入解析缓存概念、原理及应用的博客文章,结合PPT形式提供了更直观的理解。以下是根据标题和描述可能涉及的一些核心知识点: 1. **缓存基本概念**:缓存是一种存储技术,用于临时...
本文主要讨论了应用软件开发中的模式应用技术,包括层模式结构、管道和过滤器结构以及模型-视图-控制器(MVC)模式的分析与应用。这些模式在提高软件开发的适用性、可靠性、可移植性和维护性方面起到了重要作用。 层...
本文通过介绍布隆过滤器,并与传统的判重方式进行对比,同时改进布隆过滤器并应用于内容管理系统的资源判重的功能中,解决了内存占用无限增加,查询时间不断增长,记录内容无法删除等问题,实现了高效快速的资源判重。
本文将根据“浅谈大型空压机系统的维护保养.pdf”这一资料,深入探讨大型空压机系统的维护保养关键知识点。 一、日常检查与维护 1. 检查油位:空压机油是润滑和冷却的关键,确保油位在制造商推荐的范围内,防止因...
浅谈无线上网遇到连接受限制的解决方法 最近有附近朋友的电脑出现这样的一个问题,自己电脑能够连接上家里的无线网络,但提示受限制,不知道怎么去解决,刚开始我以为是电脑网络的无线网络的密码输入错误,后来经过确认...
本文将从液压油、过滤器和蓄能器三个方面阐述ST3-D液压系统的日常检查和维护方法。 首先,液压油是液压系统中非常重要的工作介质,它的主要作用是传递能量、润滑和冷却液压元件。液压油的状态直接影响液压系统的...
Struts2还提供了一些抽象类如`AbstractInterceptor`和`MethodFilterInterceptor`,简化了拦截器的实现过程,例如`MethodFilterInterceptor`允许开发者指定要过滤的Action方法。 4. **定义拦截器示例** 下面是一个...
### Web的安全防御浅谈 随着互联网的飞速发展,Web应用已经成为企业和个人不可或缺的一部分,但同时也面临着各种安全威胁。为了确保Web应用的安全性,开发者必须从设计之初就将安全因素考虑进去。本文将从几个关键...
《浅谈智能测控仪表系统》是一篇关于现代工业自动化技术的文章,主要探讨了智能测控仪表的发展方向及其在网络化、数字化和智能化方面的应用。智能测控仪表在工业控制系统中的重要性日益凸显,它们能够实现人机对话,...
其中,过滤器去除空气中的尘埃和微生物,确保室内空气质量;加热器和冷却器根据需求调节空气温度;除湿器则用于调节空气湿度,保证室内环境的舒适性。 控制系统是空调器的"大脑",它根据设定的参数和实际环境条件,...
《浅谈选矿工艺全流程自动化控制》一文深入探讨了现代工业中选矿工艺的自动化技术,这是一项涉及矿业工程、自动控制理论与实践的重要课题。选矿是将矿石中的有用成分通过物理或化学方法分离出来的过程,而全流程自动...