- 浏览: 182581 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (99)
- 备忘录 (48)
- linux (19)
- oracle (10)
- shell (8)
- awk (1)
- java (48)
- just do it (29)
- more and more (46)
- common (29)
- 设计模式 (8)
- Java Web (9)
- Spring (0)
- Structs 2 (2)
- Java 高级 (4)
- 存储 (3)
- Virtual Box (1)
- ant (1)
- maven (0)
- 数据结构 (5)
- 算法 (5)
- javascript (1)
- ajax (1)
- jquery (1)
- xml (1)
- IBM (3)
- 转载 (3)
- English (2)
- html&css (0)
- hibernate (2)
- mysql (1)
- memcached (1)
最新评论
-
飞出四季做的茧:
kris_zhang 写道int temp = 0 ; ...
Java IO流 Zip文件的压缩和解压缩 -
kris_zhang:
int temp = 0 ; while(( ...
Java IO流 Zip文件的压缩和解压缩 -
welcomezhang:
学习了,这块自己还得深挖下
为什么HashMap不是线程安全的 -
fomeiherz:
这个写的最详细了,赞一个
Java的泛型类和泛型方法 -
beijishiqidu:
hanmiao 写道http://yangguangfu.it ...
Java设计模式之策略模式
之前分享了一篇别人写的文章,想想还是自己总结一下吧,加深记忆。
首先用一个图来展示直观的印象。
由图上我们可以看到只要是从客户端到达服务器的请求也好,或是从服务器端获得的响应到客户端,其实只要配置了过滤器,并且满足过滤器的拦截条件,那么过滤器中的逻辑处理等动作都会被执行。
过滤器是Java提供的一个接口,我们在编写一个过滤器的时候,需要实现这个接口,这个类中的三个方法将都会起作用。
一般我们的过滤逻辑都会在doFilter()方法中书写。
过滤器的生命周期和一般的Servlet其实都是一样的,有个差异就是,Servlet在执行的时候,时候有父类的service()方法分发下去分别执行对应的service()方法,最终执行我们的doGet()或者doPost()方法。但是Filter执行的是doFilter()
方法。
在整个web应用中,我们不光只会用到有个Filter,我们会有很多的过滤器,他们会组成一个过滤器链,就像是高速路的收费站一样,一个接一个的检查。但是在最后一个Filter的doFilter()方法执行完成之后,就会把对应拦截到的并且已经处理的请求发送的Web资源。
在编写Filter的时候,还会接受一些初始化参数,共我们调用,这些初始化的过程都是有java自己完成的,我们只需要做的就是我们给定一个参数名称和参数值,它自己会封装在一个FilterConfig对象中。这样的话,我们需要传递什么参数就可以在XML中配置了,不用再去改动class类。
写完过滤器了,但是WEB容器并不知道啊,因此现在就要像配置Servlet一样配置Filter了。
好了,现在就展示一些源码,看了源码大家就应该清楚了。
设置字符编码的过滤器
常用的检查用户是否登录的过滤器
Servlet的代码
注意:
上述有多个过滤器,他们的启动顺序是按照xml文件中的配置顺序启动的,并且是在容器启动的时候初始化的,并不是第一次访问的时候启动的。
请求转发是不会再次经过过滤器的,因为他们是服务器端的跳转,并不是客户端向服务器端再次发起的。
重定向是会再次经过过滤器的,因为服务器会“引导”客户端浏览器重新向一个新的地址发送请求,那么肯定会再次经过过滤器。
总结:
过滤器是 Web 服务组件,可以访问客户端输入的请求和 Web 资源输出的响应
过滤器定义用于将过滤器名称与特定的类关联在一起
过滤器映射用于将过滤器映射至 Web 资源
Filter 接口包含各种方法,如 init()、doFilter() 和 destroy()
每次用户发送请求以及Web资源发送响应时都会调用 doFilter() 方法
FilterChain 接口用于调用过滤器链中的下一个过滤器
在初始化过程中,Servlet 使用 FilterConfig 将信息传递给过滤器
首先用一个图来展示直观的印象。
由图上我们可以看到只要是从客户端到达服务器的请求也好,或是从服务器端获得的响应到客户端,其实只要配置了过滤器,并且满足过滤器的拦截条件,那么过滤器中的逻辑处理等动作都会被执行。
过滤器是Java提供的一个接口,我们在编写一个过滤器的时候,需要实现这个接口,这个类中的三个方法将都会起作用。
一般我们的过滤逻辑都会在doFilter()方法中书写。
过滤器的生命周期和一般的Servlet其实都是一样的,有个差异就是,Servlet在执行的时候,时候有父类的service()方法分发下去分别执行对应的service()方法,最终执行我们的doGet()或者doPost()方法。但是Filter执行的是doFilter()
方法。
在整个web应用中,我们不光只会用到有个Filter,我们会有很多的过滤器,他们会组成一个过滤器链,就像是高速路的收费站一样,一个接一个的检查。但是在最后一个Filter的doFilter()方法执行完成之后,就会把对应拦截到的并且已经处理的请求发送的Web资源。
在编写Filter的时候,还会接受一些初始化参数,共我们调用,这些初始化的过程都是有java自己完成的,我们只需要做的就是我们给定一个参数名称和参数值,它自己会封装在一个FilterConfig对象中。这样的话,我们需要传递什么参数就可以在XML中配置了,不用再去改动class类。
写完过滤器了,但是WEB容器并不知道啊,因此现在就要像配置Servlet一样配置Filter了。
好了,现在就展示一些源码,看了源码大家就应该清楚了。
设置字符编码的过滤器
package i18n.filter; 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; public class EncodingFilter implements Filter { private String enc = "GBK"; @Override public void destroy() { System.out.println("EncodingFilter===》destroy"); } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(enc); HttpServletRequest request = (HttpServletRequest) req; System.out.println(request.getServletPath()); chain.doFilter(req, res); } @Override public void init(FilterConfig cfg) throws ServletException { String encoding = cfg.getInitParameter("encoding"); if (encoding != null) { this.enc = encoding; } System.out.println("EncodingFilter===》init"); } }
常用的检查用户是否登录的过滤器
package i18n.filter; 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.HttpSession; /** * Servlet Filter implementation class LoginCheckFilter */ public class LoginCheckFilter implements Filter { /** * Default constructor. */ public LoginCheckFilter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { System.out.println("LoginCheckFilter===》destroy"); } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req= (HttpServletRequest) request; HttpServletResponse res= (HttpServletResponse) response; HttpSession session=req.getSession(); if(session.isNew()){ res.sendRedirect(req.getContextPath()+"/index.jsp"); return; } String path=req.getServletPath(); Object userId=session.getAttribute("userId"); if(userId!=null){ chain.doFilter(request, response); return; } if("/index.jsp".equals(path)|| "/login.do".equals(path)){ chain.doFilter(request, response); return; } res.sendRedirect(req.getContextPath()+"/index.jsp"); } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { System.out.println("LoginCheckFilter===》init"); } }
Servlet的代码
package i18n; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class LoginServlet */ public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("userId===" + request.getParameter("userId")); request.getSession().setAttribute("userId", "xxxxxxxx"); request.setAttribute("errKey", "err.login.failure"); request.getRequestDispatcher("/index.jsp").forward(request, response); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>i18n</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <description></description> <display-name>LoginServlet</display-name> <servlet-name>LoginServlet</servlet-name> <servlet-class>i18n.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>i18n.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <display-name>LoginCheckFilter</display-name> <filter-name>LoginCheckFilter</filter-name> <filter-class>i18n.filter.LoginCheckFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginCheckFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LoginCheckFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> </web-app>
注意:
上述有多个过滤器,他们的启动顺序是按照xml文件中的配置顺序启动的,并且是在容器启动的时候初始化的,并不是第一次访问的时候启动的。
请求转发是不会再次经过过滤器的,因为他们是服务器端的跳转,并不是客户端向服务器端再次发起的。
重定向是会再次经过过滤器的,因为服务器会“引导”客户端浏览器重新向一个新的地址发送请求,那么肯定会再次经过过滤器。
总结:
过滤器是 Web 服务组件,可以访问客户端输入的请求和 Web 资源输出的响应
过滤器定义用于将过滤器名称与特定的类关联在一起
过滤器映射用于将过滤器映射至 Web 资源
Filter 接口包含各种方法,如 init()、doFilter() 和 destroy()
每次用户发送请求以及Web资源发送响应时都会调用 doFilter() 方法
FilterChain 接口用于调用过滤器链中的下一个过滤器
在初始化过程中,Servlet 使用 FilterConfig 将信息传递给过滤器
发表评论
-
cgroups控制cpu,memory,io使用率
2016-08-09 22:55 2661Cgroups是control groups的缩写,最初由Go ... -
为什么HashMap不是线程安全的
2016-06-15 22:27 2291序 最近因为项目的需求,经常会面试一些新人,也就会问他们 ... -
JAVA读取文件夹大小的几种方法实例
2016-04-24 15:39 776总是发现自己的C盘快满了,清理程序也不会帮我自己清理,然后 ... -
Java Regex - Matcher (java.util.regex.Matcher)
2015-03-01 13:59 884The Java Matcher class (java. ... -
Java Regex - Pattern (java.util.regex.Pattern)
2015-03-01 11:22 1577Java中的Pattern类是Java正则表达式API ... -
eclipse中查看jdk的源码
2014-11-23 11:43 1070最近一段时间跟jdk源码打交道的比较多,但是有的时候却是看 ... -
Oracle常见死锁发生的原因以及解决办法
2014-08-31 13:25 7563一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程 ... -
Struts2学习初设系列(一)之环境搭建
2014-07-20 22:47 1106已经毕业很长时间了,回过头来想想都不知道自己做了什么,由于 ... -
算法的时间复杂度分析
2014-07-20 11:14 16812.9.1 算法时间复杂度定义 在进 ... -
解析 Java 类和对象的初始化过程
2014-07-06 18:14 683问题引入 近日我在调试一个枚举类型的解析器程序,该 ... -
Java 中正确使用 hashCode 和 equals 方法
2014-07-05 18:17 688在这篇文章中,我将告诉大家我对hashCode和equals ... -
通过分析 JDK 源代码研究 Hash 存储机制
2014-07-05 17:22 649集合和引用 就像引 ... -
NIO 入门
2014-07-05 17:15 675在开始之前 关于本教程 新的输入/输出 (NIO) 库 ... -
利用AJax方式提交和Webservice完成页面输入汉字简体字回显繁体字
2014-06-29 18:05 1186最近一直在学习新的 ... -
How To Parse XML File Using XPath In Java
2014-06-29 11:59 1341最近一直在学习XML的Xpath解析方式,据说是一个很简单 ... -
Java排序算法之快速排序
2014-06-22 11:27 856快速排序使用分治法(Divide and conquer)策略 ... -
Java排序算法之简单选择排序
2014-06-21 22:31 802在网上搜索了很多的算法,貌似大家说的简单选择排序算法和直接选择 ... -
Java排序算法之冒泡排序
2014-06-21 20:22 1036冒泡排序算法的基本思想是:首先将第n-1个记录的关键字和第n个 ... -
Java排序算法之直接插入排序
2014-06-21 19:33 1238直接插入排序算法的基本思想是:把n个待排序的元素看成为 ... -
JAVA之桥接模式
2014-05-26 20:11 0桥模式:将某个问题抽象的不同形式分别与该问题的具体实现 ...
相关推荐
Java Web过滤器详解 Java Web过滤器是一种服务端组件,用于截取用户端的请求与响应信息。过滤器的应用场景非常广泛,以下是其中的一些: 一、统一认证 过滤器可以对用户请求进行统一认证,保证不会出现用户账户...
在JAVA Web开发中,过滤器(Filter)是一个至关重要的组件,它主要负责在请求被Servlet处理之前或之后执行一些预处理或后处理操作。过滤器是JAVA Servlet API的一部分,通过实现javax.servlet.Filter接口来创建...
JAVA Web 过滤器 Filter 学习资料 JAVA Web 过滤器 Filter 是一种强大且灵活的工具,用于在服务器上过滤与 servlet 或 JSP 页面相关的请求信息。它提供了多种选择,包括以常规方式调用资源、利用修改后的请求信息...
Java Web过滤器是Java Servlet技术的一部分,用于在请求被Servlet处理之前或之后对请求进行预处理和后处理。它们在Web应用程序中起着至关重要的作用,可以用来实现各种功能,如登录验证、字符编码转换、日志记录、...
在Java Web开发中,Servlet、拦截器(Interceptor)和过滤器(Filter)是三个非常重要的概念,它们在处理HTTP请求和响应时起到了关键作用。理解并熟练运用这三者能够帮助开发者实现更高效、更安全的Web应用。 首先...
本教程将详细讲解如何使用Java Web中的过滤器(Filter)来实现这样的访问控制。过滤器是Servlet API的一部分,它允许我们在请求到达目标资源(如Servlet、JSP页面)之前或之后对请求和响应进行拦截处理。 首先,...
Java过滤器是Java Web开发中的一个重要概念,它主要用于在HTTP请求和响应的过程中对数据进行预处理或后处理。在这个小样例中,我们看到的是如何使用Java实现字符过滤和标签过滤,以及字符编码的转换。这在处理用户...
文章还介绍了过滤器在Java Web开发中的典型应用场景,包括: - 安全性控制:过滤器可以在请求到达应用之前检查权限,阻止未授权的访问。 - 日志记录:过滤器可以记录请求和响应的相关信息,便于进行调试和监控。 - ...
在Java Web开发中,过滤器(Filter)是一种用于拦截请求和响应的重要机制,可以实现对用户请求的预处理和后处理,以及对响应的处理。本文将深入解析“JAVA过滤器标准代码”,探讨其核心功能、实现原理以及应用场景。...
在Java Web开发中,过滤器(Filter)是一个强大的工具,它允许开发者在数据处理的前后进行拦截和修改。本文将详细讲解Java Web项目中过滤器的使用方法,以及如何配置和实现过滤器。 1. **过滤器的概念** 过滤器是...
在Java Web开发中,"java中文过滤器"是一种常见的技术,用于处理B/S(Browser/Server)架构下中文字符编码的问题。在B/S系统中,数据通常通过HTTP协议在网络间传输,而HTTP协议默认并不规定字符编码,这可能导致在...
Java过滤器(Filter)是Java Web开发中的一个重要概念,它主要应用于Servlet容器中,如Tomcat、Jetty等。过滤器允许我们在请求被处理之前或之后进行预处理和后处理,以此来拦截、修改或者增强请求和响应。在这个简单...
本篇文章将围绕“Java自定义过滤器”这一主题展开,详细介绍自定义过滤器的设计与实现。 #### 二、基本概念 1. **过滤器接口**:`javax.servlet.Filter`是Java Web应用中的过滤器接口,所有自定义过滤器都必须实现...
Java的过滤器(Filter)是Java Web开发中的一个重要概念,主要应用于Servlet容器中,如Tomcat、Jetty等。过滤器允许开发者在请求被实际处理之前或之后进行拦截,执行预处理或后处理操作,例如权限校验、数据转换、...
Java过滤器(Filter)是Java Web开发中的一个重要概念,它主要应用于Servlet容器中,如Tomcat、Jetty等。在ACCP课程中,这个“accp java过滤器 PPT”很可能是为了帮助学习者深入理解如何在Web应用程序中有效地使用...
在Java Web开发中,过滤器(Filter)是一种非常重要的技术组件,它可以在请求到达目标资源(如Servlet或JSP页面)之前或之后执行某些操作。过滤器可以用来实现各种功能,如用户认证、权限检查、编码转换、日志记录等。...
在Java Web开发中,过滤器(Filter)是一个非常重要的组件,它允许开发者在请求被处理之前或之后执行一些额外的操作。下面将详细讲解Java中五种常用的过滤器及其应用场景。 1. **使浏览器不缓存页面的过滤器** ...
Java过滤器(Filter)是Java Web开发中的一个重要概念,它主要应用于Servlet容器中,如Tomcat、Jetty等。过滤器允许我们在请求被发送到目标资源(如Servlet、JSP页面)之前或之后进行预处理和后处理。在这个场景中,...
在Java Web开发中,Servlet过滤器(Filter)是不可或缺的一部分,它允许开发者在请求到达Servlet之前或响应离开Servlet之后对其进行处理。Servlet过滤器是按照指定的配置顺序进行调用的,能够实现数据的预处理、后...