- 浏览: 177311 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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 2558Cgroups是control groups的缩写,最初由Go ... -
为什么HashMap不是线程安全的
2016-06-15 22:27 2206序 最近因为项目的需求,经常会面试一些新人,也就会问他们 ... -
JAVA读取文件夹大小的几种方法实例
2016-04-24 15:39 710总是发现自己的C盘快满了,清理程序也不会帮我自己清理,然后 ... -
Java Regex - Matcher (java.util.regex.Matcher)
2015-03-01 13:59 851The Java Matcher class (java. ... -
Java Regex - Pattern (java.util.regex.Pattern)
2015-03-01 11:22 1526Java中的Pattern类是Java正则表达式API ... -
eclipse中查看jdk的源码
2014-11-23 11:43 1011最近一段时间跟jdk源码打交道的比较多,但是有的时候却是看 ... -
Oracle常见死锁发生的原因以及解决办法
2014-08-31 13:25 7519一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程 ... -
Struts2学习初设系列(一)之环境搭建
2014-07-20 22:47 1070已经毕业很长时间了,回过头来想想都不知道自己做了什么,由于 ... -
算法的时间复杂度分析
2014-07-20 11:14 16432.9.1 算法时间复杂度定义 在进 ... -
解析 Java 类和对象的初始化过程
2014-07-06 18:14 645问题引入 近日我在调试一个枚举类型的解析器程序,该 ... -
Java 中正确使用 hashCode 和 equals 方法
2014-07-05 18:17 640在这篇文章中,我将告诉大家我对hashCode和equals ... -
通过分析 JDK 源代码研究 Hash 存储机制
2014-07-05 17:22 603集合和引用 就像引 ... -
NIO 入门
2014-07-05 17:15 635在开始之前 关于本教程 新的输入/输出 (NIO) 库 ... -
利用AJax方式提交和Webservice完成页面输入汉字简体字回显繁体字
2014-06-29 18:05 1135最近一直在学习新的 ... -
How To Parse XML File Using XPath In Java
2014-06-29 11:59 1296最近一直在学习XML的Xpath解析方式,据说是一个很简单 ... -
Java排序算法之快速排序
2014-06-22 11:27 800快速排序使用分治法(Divide and conquer)策略 ... -
Java排序算法之简单选择排序
2014-06-21 22:31 755在网上搜索了很多的算法,貌似大家说的简单选择排序算法和直接选择 ... -
Java排序算法之冒泡排序
2014-06-21 20:22 984冒泡排序算法的基本思想是:首先将第n-1个记录的关键字和第n个 ... -
Java排序算法之直接插入排序
2014-06-21 19:33 1173直接插入排序算法的基本思想是:把n个待排序的元素看成为 ... -
JAVA之桥接模式
2014-05-26 20:11 0桥模式:将某个问题抽象的不同形式分别与该问题的具体实现 ...
相关推荐
JAVA web过滤器Filter学习资料,精心整理,15页.
JAVA Web中过滤器是必须要有的,我们的网页需要过滤一些不需要的东西,都是由过滤器来实现的,这个也许对大家有所帮助
java web使用过滤器的案列, 含过滤器案列和监听器案列, 有监听器案列之用户踢人的案列, 和过滤器30天自动登陆的案列, 以及过滤器乱码的情况处理
java web 过滤器防止Xss、sql注入,基于spring boot 2.0框架开发。
java-web servlet 拦截器 过滤器使用 java-web servlet 拦截器 过滤器使用
java Web项目中过滤器使用方法,很有用的
配置在web.xml中,可以防止SQL注入,可以自己定义一些需要过滤的特殊字符
实现对网页的访问控制权限,使用过滤器的方法实现的权限访问
过滤器在Java Web开发中的应用研究.pdf
java web过滤器使用方法,含自动登陆和乱码的过滤器。很适合数学java web的人看,有注释。
《Java Web整合开发王者归来(JSP+Servlet+Struts+Hibernate+Spring)》全面介绍了Java Web开发中的各种相关技术及知识。全书分为9篇,内容层次清晰,难度循序渐进。第1篇为入门篇,内容包括Java Web开发概述等;第2篇...
Javaweb中过滤器的三个小案例:案例1:分IP统计网站的访问次数;案例2 粗粒度权限控制(根据用户名登陆);案例4、解决全站字符乱码(POST和GET中文乱码问题)
本文主要介绍了java web过滤器处理乱码的方法解析。具有很好的参考价值。下面跟着小编一起来看下吧
java过滤器-CharsetAllEncodingFilter.java 及 web.xml的配置
全书详细讲解了java web开发的相关技术知识,主要包括javascript、jsp、javabean、表达式语言(el)、jsp标签库、servlet过滤器和监听器,ajax核心编程、数据库核心编程以及struts2框架核心编程等知识。《Java Web...
完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT...
开发中总结的通用过滤器配置,包括EncodingFilter类、jsp页面配置和web.xml文件的配置代码
java web 购物车,字符过滤器,权限过滤器,详细备注,适合初学者,servlet ,jsp,有数据库,简单易懂,
主要对servlet过滤器的实践,内有报告,软件使用eclispe,具体参考地址:https://www.cnblogs.com/zqm-sau/p/10331883.html