- 浏览: 43695 次
- 性别:
- 来自: 上海
最近访客 更多访客>>
最新评论
-
xxxl8023:
貌似还是不行啊
oralce 数据库不同表空间数据导入 -
一衣带水:
看commons的ioutils
删除文件和目录 -
hanbin51987:
很有用哦 嘎嘎 谢谢 拿走啦 嘎嘎
删除文件和目录
其实J2EE中太多的定义是很烦人的,设计模式也很抽象的,今天我就以Servlet2.3中新增的Filter在Web Application中的应用,来进一步的说明设计模式。
首先假设我们现在想做一个Web Application(例如BBS)。
要求具备下列功能:
1、 在用户发帖子之前,要进行身份认证,以确认该用户是已登陆用户。
2、 其次是要对删除帖子,修改帖子,进行权限检查。
3、 访问特定资源(Web 页、JSP 页)时的身份认证
那么对待这些要求我们该怎么去做,如果在每个页面中都写检查权限的代码,不是一个好想法,且使的程序的可重用性降低,对比设计模式Intercepting Filter(截获过滤)正好符合我们的要求,且在Servlet2.3中通过使用过滤器(Filter)能够使得Web Application开发者能够在请求到达Web资源之前截取请求,在处理请求之后修改应答。
一个执行过滤器的Java 类必须实现javax.servlet.Filter 接口。这一接口含有三个方法:
init(FilterConfig):这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在 web.xml 文件中指定的filter初始化参数(文章的后面有lightningboard 的web.xml文件)。
doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。它同样是上一个过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息,Filter中因为有了 FilterChain,就使的几个FILTER 成了一个链条。
destroy():容器在销毁过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法
在开源的lightningboard BBS中实现了两个Filter,如下
1、ControllerFilter在这里起到的是Front Controller(前端控制器)的作用,是MVC模式中的控制器,是该BBS的入口点。
package lightningboard; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.FilterChain; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lightningboard.action.*; /** * Control all *.do. * @version 0.3.5 * @author Xiaobo Liu */ public class ControllerFilter implements Filter { /** * Action dispatch * example: homde.do will be create HomeAction and call its excute() method. */ protected FilterConfig filterConfig; public void init(FilterConfig config) { this.filterConfig = config; } public void destroy() { this.filterConfig = null; } public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain) throws IOException, ServletException{ HttpServletRequest request = (HttpServletRequest)srequest; HttpServletResponse response = (HttpServletResponse)sresponse; long timeStart=System.currentTimeMillis(); Configuration cfg=Configuration.getInstance(); String encoding=cfg.getValue("SYS.ENCODING"); request.setCharacterEncoding(encoding); String path = (String) request.getRequestURI(); String actionString = path.substring(path.lastIndexOf("/") + 1,path.lastIndexOf(".")); String forwardPage=null; try { if(actionString.equals("forum")) forwardPage=new ForumAction().excute(request,response); else if(actionString.equals("topic")) forwardPage=new TopicAction().excute(request,response); else if(actionString.equals("user")) forwardPage=new UserAction().excute(request,response); else if(actionString.equals("userList")) forwardPage=new UserListAction().excute(request,response); else if(actionString.equals("login")) forwardPage=new LoginAction().excute(request,response); else if(actionString.equals("register")) forwardPage=new RegisterAction().excute(request,response); else if(actionString.equals("post")) forwardPage=new PostAction().excute(request,response); else if(actionString.equals("postP")) forwardPage=new PostPAction().excute(request,response); else if(actionString.equals("userEdit")) forwardPage=new UserEditAction().excute(request,response); else if(actionString.equals("userEditP")) forwardPage=new UserEditPAction().excute(request,response); else if(actionString.equals("logout")) forwardPage=new LogoutAction().excute(request,response); else //default: home forwardPage=new HomeAction().excute(request,response); }catch (ActionException ex) { Debug.out(ex); request.setAttribute("actionMessage",new ActionMessage("system_error")); forwardPage="/actionMessage.jsp"; } // forward page if (forwardPage!=null){ String processTime=""+(System.currentTimeMillis()-timeStart); request.setAttribute("processTime",processTime); filterConfig.getServletContext().getRequestDispatcher(forwardPage).forward(request,response); } } }
2、此FILTER起的是Intercepting Filter(截获过滤)的作用。
package lightningboard.filter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.FilterChain; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class SessionAuthorizationFilter implements Filter { protected FilterConfig filterConfig; public void init(FilterConfig config) { this.filterConfig = config; } public void destroy() { this.filterConfig = null; } private boolean passed(ServletRequest request, ServletResponse response) throws IOException, ServletException { boolean result=false; String objectName=this.filterConfig.getInitParameter("OBJECT_NAME"); HttpServletRequest req = (HttpServletRequest)request; HttpSession session =req.getSession(false); if(session!=null){ Object object=session.getAttribute(objectName); if(object!=null) result= true; } return result; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException{ if (passed(request,response)) filterChain.doFilter(request, response); else{ HttpServletResponse res = (HttpServletResponse)response; String errorPage=this.filterConfig.getInitParameter("ERROR_PAGE"); res.sendRedirect(errorPage); } } }
容器通过 Web 应用程序中的配置描述符 web.xml 文件解析过滤器配置信息。有两个新的标记与过滤器相关: 和 。 标记是一个过滤器定义,它必定有一个 和 子元素。 子元素给出了一个与过滤器实例相关的名字。 指定了由容器载入的实现类。您能随意地包含一个 子元素为过滤器实例提供初始化参数。 标记代表了一个过滤器的映射,指定了过滤器会对其产生作用的 URL 的子集。
lightningboard 项目中的web.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <filter> <filter-name>controllerFilter</filter-name> <filter-class>lightningboard.ControllerFilter</filter-class> </filter> <filter> <filter-name>sessionAuthorizationFilter</filter-name> <filter-class>lightningboard.filter.SessionAuthorizationFilter</filter-class> <init-param> <param-name>ERROR_PAGE</param-name> <param-value>login.jsp</param-value> </init-param> <init-param> <param-name>OBJECT_NAME</param-name> <param-value>loginBean</param-value> </init-param> </filter> <filter-mapping> <filter-name>sessionAuthorizationFilter</filter-name> <url-pattern>/post.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>sessionAuthorizationFilter</filter-name> <url-pattern>/postP.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>sessionAuthorizationFilter</filter-name> <url-pattern>/post.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>sessionAuthorizationFilter</filter-name> <url-pattern>/userEdit.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>sessionAuthorizationFilter</filter-name> <url-pattern>/userEditP.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>sessionAuthorizationFilter</filter-name> <url-pattern>/userEdit.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>sessionAuthorizationFilter</filter-name> <url-pattern>/userList.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>controllerFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
发表评论
-
J2EE开发之常用开源项目介绍
2011-06-14 15:42 587主要就我所了解的J2EE开发的框架或开源项目做个介绍,可以 ... -
JSTL实现自增
2011-06-08 10:26 639<%@ page contentType="t ... -
面试题1
2011-02-16 10:34 608本周去参加了一次面试,到现在还记得一道算法题: 1、除 ... -
APPFUSE2.0.1开发过程的问题记录和解决办法
2011-02-15 11:16 9961。怎样使每次测试时不删除数据库中表结构? 解答:将pom.x ... -
解压版Tomcat6变成服务器版
2010-11-08 14:56 13451、下载解压版的tomcat 6.*; 2、 运行-> ... -
文件的解压和压缩
2008-11-18 17:28 1129package com.kehwa.me17.util; im ... -
J2EE开发之常用开源项目介绍
2008-05-22 17:52 8251持久层:1)Hibernate这个不用介绍了,用的很频繁,用 ... -
servlet 相关的Listener应用
2008-04-06 14:33 996从作用域范围来说,Servlet的作用域有ServletCon ... -
java日期格式专题
2008-04-01 11:49 22911.将日期类型转化为指定格式的字符串类型 Date d = ... -
聊天系统历程(一)
2008-03-29 12:42 4用Java实现简易聊天室目的:熟练掌握j2se的各个知识点,并 ... -
WEB项目开发的一般流程
2008-03-27 17:29 3588WEB项目开发的一般流 ... -
J2EE设计模式浅谈(一)
2008-03-11 16:46 3296J2EE设计模式浅谈 zhuam@st ... -
删除文件和目录
2007-11-27 21:21 879本例子介绍如何删除文件系统上的文件和目录,能删除单个 ... -
iBatis学习小结
2007-10-30 09:02 1135sqlMap文件 代码 <?xml ver ...
相关推荐
J2ee设计模式.pdfJ2ee设计模式.pdf
J2EE设计模式.ppt J2EE设计模式.ppt
实用J2EE设计模式编程指南.pdf J2ee设计模式
23种JAVA设计模式和15种J2EE设计模式,各个模式的简述。
23种Java设计模式和15种J2EE设计模式.pdf
彭晨阳(板桥里人)写的J2EE设计模式 总结的很简练
实用J2EE设计模式编程指南
《实用J2EE设计模式编程指南》,高清扫描版!!!提升自己的编程水平!!!
J2EE设计模式,彭晨阳(板桥里人)
【中文】【J2EE设计模式】【(PDF) 】,提供下载地址,经典的资料,书籍,绝对经典!
J2EE_设计模式,不错的资源,共享给大家
压缩包里面包括设计模式的API和搞笑解释,详细的描述了J2EE的全部设计模式,适合初学者学习
j2ee设计模式22中j2ee设计模式22中j2ee设计模式22中
一个运用多个J2EE设计模式的小型病历资料管理系统,包括MVC 装饰器 数据库与数据等重要设计模式。