国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
J2EE設(shè)計模式淺談(2)
J2EE設(shè)計模式淺談(2)

其實J2EE中太多的定義是很煩人的,設(shè)計模式也很抽象的,今天我就以Servlet2.3中新增的Filter在Web Application中的應(yīng)用,來進一步的說明設(shè)計模式。
首先假設(shè)我們現(xiàn)在想做一個Web Application(例如BBS)。
要求具備下列功能:
1、 在用戶發(fā)帖子之前,要進行身份認證,以確認該用戶是已登陸用戶。
2、 其次是要對刪除帖子,修改帖子,進行權(quán)限檢查。
3、 訪問特定資源(Web 頁、JSP 頁)時的身份認證
那么對待這些要求我們該怎么去做,如果在每個頁面中都寫檢查權(quán)限的代碼,不是一個好想法,且使的程序的可重用性降低,對比設(shè)計模式Intercepting Filter(截獲過濾)正好符合我們的要求,且在Servlet2.3中通過使用過濾器(Filter)能夠使得Web Application開發(fā)者能夠在請求到達Web資源之前截取請求,在處理請求之后修改應(yīng)答。
一個執(zhí)行過濾器的Java 類必須實現(xiàn)javax.servlet.Filter 接口。這一接口含有三個方法:
init(FilterConfig):這是容器所調(diào)用的初始化方法。它保證了在第一次 doFilter() 調(diào)用前由容器調(diào)用。它能獲取在 web.xml 文件中指定的filter初始化參數(shù)(文章的后面有l(wèi)ightningboard 的web.xml文件)。
doFilter(ServletRequest, ServletResponse, FilterChain):這是一個完成過濾行為的方法。它同樣是上一個過濾器調(diào)用的方法。引入的 FilterChain 對象提供了后續(xù)過濾器所要調(diào)用的信息,F(xiàn)ilter中因為有了 FilterChain,就使的幾個FILTER 成了一個鏈條。
destroy():容器在銷毀過濾器實例前,doFilter()中的所有活動都被該實例終止后,調(diào)用該方法
在開源的lightningboard BBS中實現(xiàn)了兩個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<BR />
* 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 應(yīng)用程序中的配置描述符 web.xml 文件解析過濾器配置信息。有兩個新的標記與過濾器相關(guān):<filter> 和 <filter-mapping>。<filter> 標記是一個過濾器定義,它必定有一個 <filter- name> 和 <filter-class> 子元素。<filter-name> 子元素給出了一個與過濾器實例相關(guān)的名字。<filter-class> 指定了由容器載入的實現(xiàn)類。您能隨意地包含一個 <init-param> 子元素為過濾器實例提供初始化參數(shù)。<filter-mapping> 標記代表了一個過濾器的映射,指定了過濾器會對其產(chǎn)生作用的 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>
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Spring MVC防御CSRF、XSS和SQL注入攻擊
Servlet過濾器和監(jiān)聽器知識總結(jié)
java 解決字符集的亂碼問題
java SSH中防止非法登錄 過濾器的使用
Java平臺國際編碼問題分析_SUN-JAVA技術(shù)
Filter技術(shù)的應(yīng)用(轉(zhuǎn))
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服