- 浏览: 458995 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (354)
- 面向对象分析设计/系统架构 (12)
- Mysql/Orcal11g (13)
- JSP/Java//Python/Xharbour (66)
- 软件测试 (21)
- 信息安全小知识 (1)
- Android (5)
- IT生活/哲学/兵法 (23)
- 软件工程/UML/需求分析学习与实践 (6)
- 操作系统/网络/组成原理 (9)
- 持续集成Maven/Hudson/自动化测试 (9)
- eBay /Paypal developer (10)
- Hadoop/HBase/Solr (0)
- 重构分析及其思考 (2)
- 企业架构 (7)
- 分析模式/设计模式 (4)
- SSH学习笔记 (1)
- Quartz及其JWatch监控 (0)
- Linux服务器 (0)
- ExtJs学习笔记 (1)
- 重读java编程思想 (3)
- ESB/SOA/WebServices (0)
- SpringMVC/Struts/Hibernate/Spring (7)
- Xharbour/Pelles C/ SQLite3 (0)
- Magento 电商 (1)
- Object C (1)
- note/redis (0)
- SpringBoot (0)
最新评论
-
snow8261:
太粗略了。
企业架构之数据架构 -
haithink:
面试成功没?
JVM 加载Class文件的原理及其机制 -
feisi0003731843:
不好意思我没有重启,重启后好多了,可有的地方回放还是不成功的。 ...
Selenium IDE测试ExtJs一种测试解决办法 -
feisi0003731843:
这个好像不行吧,我试过了不好使啊。还是用id来做的。不能用啊。 ...
Selenium IDE测试ExtJs一种测试解决办法 -
yuchensuifeng:
您好,静态页面是可以的,但是,我指定error-page为js ...
JSP创建错误处理页面
Web应用中的过滤器截取从客户端进来的请求,并做出处理的答复。它可以说是外部进入网站的第一道夫。在这个关卡里,可以验证客户是否来自可信的网络,可以对客户提交的数据进行重新编码,可以从系统里获得配置的信息,可以过滤掉客户的某些不应出现的词汇,可以验证客户是否已经登录,可以验证客户端的浏览器是否支持当前的应用,可以记录系统的日志等。
可以为一个web应用组件部署多个过滤器,这些过滤器组成一个过滤链,每个过滤器只执行某个特定的操作或者检查。这样请求在达到被访问的目标之前,需要经过这个个过滤链。如果由于安全的问题不能访问目标资源,那么过滤器就可以把客户端的请求拦截。
Filter的开发
在应用开发中,经常使用的过滤功能就是对客户端的请求进行统一编码,对客户端进行认证。下面给出一个例子。假设客户需要访问一个secutity/index.jsp页面,这个也没接收一些参数,这些参数需要保存到数据库中,为了在数据库中使用相同的编码,可以开发一个过滤器对请求进行统一编码。Security目录下的所有页面都是受限制的页面,只有通过授权的用户才能访问,如果按照平常的方式,在每个页面都对用户进行授权,这样不仅编程困难,而代码的修改也很困难,这里开发一个进行安全检查的过滤器。
1. EncodingFilter
要开发一个Filter,必须直接或者间接实现Filter接口。Filter接口定义如下的方法:
1. init() 用于获得FilterConfig对象
2. destroy() 销毁这个Filter
3. doFilter() 进行过滤处理
在EncodingFilter中,在init方法中通过configgetInitParamter("encoding")获得FilterConfig中的参数,可以看出这种获得参数的方法和Servlet获得初始参数是一样的。doFilter是过滤器中最重要的方法,通过这个方法进行实际的业务处理,在doFilter方法中,首先获得HTTP的请求和响应对象,然后对HTTP请求中的参数进行统一编码,这里采用的编码方式是GB2312。进行编码后,就把控制权转让给下一个过滤器。如果在这个过滤链中没有下一个过滤器,那么就会把请求直接发送到目标。
下面给出Filter的描述
上例中,首先声明了EncodingFilter的名字为encoding,然后指定它的实现类,这里是com.test.ch9.EncodingFilter。Filter的名字和实现类的指定是必需的。由于在EncodingFilter中需要使用初始参数,故在这里需要进行声明,用<init-param>声明初始参数。
2.SignonFilter
下面我们来看另一个Filter的开发,这个Filter用于对用户的访问认证。如果认证通过,那么允许访问指定的资源;如果认证不通过,那么把请求转发到登录的界面。
过滤代码如下:
在SignonFilter的doFilter方法中,首先通过isLogin=(String)session.getAttribute("isLogin")代码获得用户是否登录的属性。如果这个属性是"true",表示用户已经登录,那么就可以访问目标资源;如果这个属性是"false",表示用户没有登录,那么把请求转发到"login_signon.jsp"。
配置
配置Filter有两个任务,首先声明Filter,然后是使用Filter
在声明Filter时,需要指定Filter的名字和Filter的实现类。如果有参数,那么要配置它的参数。在使用Filter时,主要做一些URL的映射,和Filter映射匹配的请求会被处理。例如:给前两个Filter进行配置
在上面的配置中,Encoding Filter指定初始参数,这个参数的名字为"encoding",它的值为gb2312.
接着是Filter的映射。在EncodingFilter的Filter-mapping中,它的URL Pattern为"/*",这表示对任何URL的请求都会被过滤。SignonFilter的一个URL Pattern为"/security/*",表示以/security开始的所有URL将被过滤。通过,"/admin/*"表示以/admin开始的所有URL将被过滤。
从上面的配置可以看出,一个Filter可以有多个Filter Mapping,也就是说,这个Filter可以为多个Web组件实现过滤。另一方面,一个Web组件可以有多个过滤器,这些过滤器按照配置中出现的先后组成一个过滤链。如/security/index.jsp,它就和另个过滤器匹配,这样在请求到达/security.index.jsp之前,首先经过EncodingFilter的处理。然后经过SignonFilter的处理。如果在SignonFilter中通过验证,那么将访问/security/index.jsp页面,如果认证不同,那么请求就被拦截。
可以为一个web应用组件部署多个过滤器,这些过滤器组成一个过滤链,每个过滤器只执行某个特定的操作或者检查。这样请求在达到被访问的目标之前,需要经过这个个过滤链。如果由于安全的问题不能访问目标资源,那么过滤器就可以把客户端的请求拦截。
Filter的开发
在应用开发中,经常使用的过滤功能就是对客户端的请求进行统一编码,对客户端进行认证。下面给出一个例子。假设客户需要访问一个secutity/index.jsp页面,这个也没接收一些参数,这些参数需要保存到数据库中,为了在数据库中使用相同的编码,可以开发一个过滤器对请求进行统一编码。Security目录下的所有页面都是受限制的页面,只有通过授权的用户才能访问,如果按照平常的方式,在每个页面都对用户进行授权,这样不仅编程困难,而代码的修改也很困难,这里开发一个进行安全检查的过滤器。
1. EncodingFilter
package com.test.ch9; import javax.servlet.FilterChain; import javax.servlet.ServletRequest; import javax.Servlet.ServletResponse; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.servlet.FilterConfig; public class EncodingFilter implements Filter { protected FilterConfig filterConfig; private String targetEncoding="gb2312"; // 初始化过滤器和一般的Servlet一样,它也可以获得初始参数 public void init(FilterConfig config)throws ServletException { this.filterConfig=config; this.targetEncoding=config.getInitParameter("encoding"); } //进行过滤处理,这个方法最重要,所有过滤处理的代码都在此实现 public void doFilter(ServletRequest srequest,ServletResponse sreponse,FilterChain chain)throws IOException,ServletException{ System.out.println("使用以下方法对请求进行编码:encoding="+targetEncoding); HttpServletRequest request=(HttpServletRequest)srequest; request.setCharacterEncoding(targetEncoding); //把处理权发送到下一个 chain.doFilter(srequest,sresponse); } public void setFilterConfig(final FilterConfig filterConfig) { this.filterConfig=filterConfig; } //销毁过滤器 public void destroy(){ this.filterConfig=null; } }
要开发一个Filter,必须直接或者间接实现Filter接口。Filter接口定义如下的方法:
1. init() 用于获得FilterConfig对象
2. destroy() 销毁这个Filter
3. doFilter() 进行过滤处理
在EncodingFilter中,在init方法中通过configgetInitParamter("encoding")获得FilterConfig中的参数,可以看出这种获得参数的方法和Servlet获得初始参数是一样的。doFilter是过滤器中最重要的方法,通过这个方法进行实际的业务处理,在doFilter方法中,首先获得HTTP的请求和响应对象,然后对HTTP请求中的参数进行统一编码,这里采用的编码方式是GB2312。进行编码后,就把控制权转让给下一个过滤器。如果在这个过滤链中没有下一个过滤器,那么就会把请求直接发送到目标。
下面给出Filter的描述
<web-app> ... <filter> <filter-name>encoding</filter-name> <filter-class>com.test.ch9.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>gb2312</param-value> </init-param> </filter> .... </web-app>
上例中,首先声明了EncodingFilter的名字为encoding,然后指定它的实现类,这里是com.test.ch9.EncodingFilter。Filter的名字和实现类的指定是必需的。由于在EncodingFilter中需要使用初始参数,故在这里需要进行声明,用<init-param>声明初始参数。
2.SignonFilter
下面我们来看另一个Filter的开发,这个Filter用于对用户的访问认证。如果认证通过,那么允许访问指定的资源;如果认证不通过,那么把请求转发到登录的界面。
过滤代码如下:
package com.test.ch9; import javax.servlet.FilterChain; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.servlet.FilterConfig; import javax.servlet.http.HttpSession; public class SignonFilter implemenets Filter { String LOGIN_PAGE="login_signon.jsp"; protected FilterConfig filterConfig; //过滤处理的方法 public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException{ HttpServletRequest hreq=(HttpServletRequest)req; HttpServletResponse hres=(HttpServletResponse)res; HttpSession session=hreq.getSession(); String isLogin=""; try{ isLogin=(String)session.getAttribute("isLogin"); if(isLogin.equals("true")) { System.out.println("在SignonFilter中验证通过"); //验证成功,继续处理 chain.doFilter(req,res); } else { //验证不成功,让用户登录 hres.sendRedirect(LOGIN_PAGE); System.out.println("被SignonFilter拦截一个未认证的请求"); } } catch(Exception e) { e.printStackTrace(); } } public void setFilterConfig(final FilterConfig filterConfig) { this.filterConfig=filterConfig; } //销毁过滤器 public void destroy(){ this.filterConfig=null; } //初始过滤器和一般的Servlet一样,它也可以获得初始参数 public void init(FilterConfig config)throws ServletException { this.filterConfig=config; } }
在SignonFilter的doFilter方法中,首先通过isLogin=(String)session.getAttribute("isLogin")代码获得用户是否登录的属性。如果这个属性是"true",表示用户已经登录,那么就可以访问目标资源;如果这个属性是"false",表示用户没有登录,那么把请求转发到"login_signon.jsp"。
配置
配置Filter有两个任务,首先声明Filter,然后是使用Filter
在声明Filter时,需要指定Filter的名字和Filter的实现类。如果有参数,那么要配置它的参数。在使用Filter时,主要做一些URL的映射,和Filter映射匹配的请求会被处理。例如:给前两个Filter进行配置
<filter> <filter-name>encoding</filter-name> <filter-class>com.test.ch9.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>gb2312</param-value> </init-param> </filter> <filter> <filter-name>auth</filter-name> <filter-class>com.test.ch9.SignonFilter</filter-class> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>auth</filter-name> <url-pattern>/security/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>auth</filter-name> <url-pattern>/admin/*<url-pattern> </filter-mapping>
在上面的配置中,Encoding Filter指定初始参数,这个参数的名字为"encoding",它的值为gb2312.
接着是Filter的映射。在EncodingFilter的Filter-mapping中,它的URL Pattern为"/*",这表示对任何URL的请求都会被过滤。SignonFilter的一个URL Pattern为"/security/*",表示以/security开始的所有URL将被过滤。通过,"/admin/*"表示以/admin开始的所有URL将被过滤。
从上面的配置可以看出,一个Filter可以有多个Filter Mapping,也就是说,这个Filter可以为多个Web组件实现过滤。另一方面,一个Web组件可以有多个过滤器,这些过滤器按照配置中出现的先后组成一个过滤链。如/security/index.jsp,它就和另个过滤器匹配,这样在请求到达/security.index.jsp之前,首先经过EncodingFilter的处理。然后经过SignonFilter的处理。如果在SignonFilter中通过验证,那么将访问/security/index.jsp页面,如果认证不同,那么请求就被拦截。
发表评论
-
java实现读取文件下所有的excel文件
2012-08-10 09:30 2094最近处理一个压缩包,里面有几百上千个excel文件。本来 ... -
在firefox浏览器下出现如果引用外部连接不存在会隐藏红叉
2012-07-23 15:38 998在firefox下引用出错的一些图片会隐藏红叉。而在IE下 ... -
java 字符替换的一些问题值得记录下
2011-09-30 16:40 889最近在处理一些字符串的替换中发生的一些问题。 最近需要临 ... -
ExtJs学习之弹出框,提示框,输入框等框
2011-06-23 22:13 93891.ExtJs之消息框: 语法:Ext.MessageB ... -
FreeMarker学习之概念
2010-08-04 10:12 865FreeMarker概述: 引用 1. ... -
HTML标准属性
2010-07-03 20:35 760核心属性(Core attributes) 以下标签 ... -
HTML标签
2010-07-03 20:14 1031HTML 4.01 / XHTML 1.0 参考手册 按字母 ... -
HTML基础
2010-07-03 00:54 778基于Web前端技术是有HTML静态语言向现在的JaveSc ... -
Struts2的开发规范和技巧
2010-05-28 14:56 1246基于Struts2的开发,如果没有足够的经验和规范做支撑,并不 ... -
第一次的Struts2的一个异常记录
2010-05-28 14:22 1063在配置正确struts.xml、web.xml、Action类 ... -
Java处理Excel全解一
2010-05-25 10:00 2193在获取客户需求的时候 ... -
Java EE 6 规范之平台概述
2010-05-22 21:28 2218JavaTM平台企业版(Java EETM)的概述 体系结构 ... -
Python3入门学习
2010-05-14 14:51 2241在学习一门计算机语言的时候,首先接触的入门程序基本上都是& ... -
Python3操作文件,目录和路径
2010-05-14 11:48 35131.遍历文件夹和文件 ... -
内存溢出
2010-04-22 14:23 1430java SE应用程序共同的问 ... -
JPA之ManyToMany的处理
2010-04-18 14:17 4516在处理关系中,最为麻烦的可能是多对多的关系处理,因为多对多 ... -
JPA之OneToOne关系处理
2010-04-18 14:05 3952在很早学习关系数据库的时候学过一对多,多对一,一对一,多对多的 ... -
JPA之OneToMany和ManyToOne处理
2010-04-18 13:52 18932前面介绍和总结了JPA ... -
JPA学习之二(入门篇)
2010-04-16 10:48 3768简单总结下,JPA的入门。在学习JPA的时候运用参考Hib ... -
JPA2.0的学习一
2010-04-15 17:18 8642Java EE 5平台引入了Java ...
相关推荐
随后,随着Servlet 3.0版本的发布,过滤器技术继续获得增强,新特性包括异步处理、注解支持和可插拔性支持等,这些都进一步简化了Java Web应用的开发和部署过程。 过滤器技术的核心是Filter接口,该接口定义了三个...
在JAVA Web开发中,过滤器(Filter)是一个至关重要的组件,它主要负责在请求被Servlet处理之前或之后执行一些预处理或后处理操作。过滤器是JAVA Servlet API的一部分,通过实现javax.servlet.Filter接口来创建...
总结一下,Web过滤器在C#的ASP.NET开发中扮演着关键角色,它们提供了一种灵活的机制来扩展和控制Web应用程序的行为。"Web过滤器 c#"的讨论涉及了四种主要类型的过滤器,以及如何利用开源库"WebMIS....
在Java Web应用开发中,过滤器(Filter)是一种强大的工具,它可以用来在请求到达目标Servlet或JSP之前对其进行处理,并在响应返回给客户端之前进行后处理。本案例着重讲解如何利用过滤器进行身份验证,避免在每个...
实现一个禁止缓存的过滤器。 要求和提示: (1)禁止浏览器缓存所有动态页面; (2)有3个http响应头字段可以禁止浏览器缓存当前页面,它们在Servlet中的示例代码如下。 response.setDateHeader("Expires",-1); ...
在Java Web开发中,过滤器(Filter)是一个强大的工具,它允许开发者在数据处理的前后进行拦截和修改。本文将详细讲解Java Web项目中过滤器的使用方法,以及如何配置和实现过滤器。 1. **过滤器的概念** 过滤器是...
【Java Web开发中的过滤器组件应用及实例解析】 ...理解过滤器的工作原理和如何在项目中有效利用它们,对于提升Java Web应用的健壮性和灵活性至关重要。通过实例分析,我们可以更直观地掌握过滤器的配置和使用方法。
Servlet过滤器是按照指定的配置顺序进行调用的,能够实现数据的预处理、后处理、权限控制、字符编码转换等多种功能,极大地增强了Web应用程序的功能性和灵活性。 Servlet过滤器的实现基于Java Servlet API中的...
在本实验报告中,主题是Java Web应用开发,主要探讨了如何使用过滤器(Filter)和监听器(Listener)来增强应用程序的安全性和用户体验。实验旨在加深对Java Web开发中核心概念的理解,特别是过滤器的工作原理、配置...
通过以上知识点,我们可以理解如何使用Spring整合Jetty来开发Web应用,从而实现更高效、更灵活的开发流程。实际项目中,开发者可以根据具体需求调整配置,如添加过滤器、监听器,或者配置更多的Servlet和Filter,以...
Java Web开发中的过滤器(Filter)是Servlet技术的一部分,它在Web应用程序中扮演着至关重要的角色。过滤器允许开发者在请求被发送到目标资源(如Servlet、JSP页面)之前和响应被返回给客户端之后对请求和响应进行...
在Java Web开发中,Servlet、拦截...通过合理地组合和配置Servlet、过滤器和拦截器,我们可以构建出功能强大且灵活的Java Web应用。在学习和实践中,不仅要理解它们的概念,还需要掌握如何根据实际需求进行设计和优化。
以上三个案例展示了JavaWeb过滤器在实际开发中的应用。它们不仅能够提升网站的功能,还能增强系统的安全性与稳定性。理解并熟练掌握过滤器的使用,对于提升JavaWeb开发技能大有裨益。在实践中,开发者可以根据需求...
例如,在Web应用程序中,我们可以使用过滤器来将图像格式从JPEG转换为PNG,以提高图像的质量。 五、响应内容压缩 过滤器可以对响应的内容进行压缩。例如,在Web应用程序中,我们可以使用过滤器来压缩响应的内容,以...
在Java JSP Web开发中,过滤器(Filter)是一个重要的组件,它允许开发者对Web应用程序中的请求和响应进行拦截和处理,从而增强应用的功能。过滤器的概念源自Java Servlet规范,是Java EE(现称为Jakarta EE)的一...
Java Web 应用与开发教程是针对初学者和有经验的开发者设计的一套全面学习资料,旨在帮助读者深入理解如何构建基于Java技术的Web应用程序。本教程由宋波老师编著,提供了丰富的教学内容和实践案例,以促进理论与实际...
在Servlet规范中,过滤器(Filter)是部署在Web应用程序中的组件,可以在请求到达目标Servlet或JSP之前对请求进行预处理。字符编码过滤器的作用是在请求被处理之前设定请求和响应的编码方式,以确保数据在传输过程中...
学习Servlet的生命周期、请求与响应处理、会话管理以及过滤器和监听器的使用,是构建动态Web应用的基础。 3. **JSP(JavaServer Pages)**:JSP是HTML与Java代码结合的页面,用于展示动态内容。理解JSP指令、脚本...
为了解决这些问题,Web应用引入了过滤器技术。例如,在构建一个BBS论坛时,需要在用户发帖前进行身份验证,删除或修改帖子时进行权限检查。如果在每个页面都编写检查代码,不仅效率低下,还会降低代码的复用性。此时...