国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

EJB最佳實(shí)踐:實(shí)體bean保護(hù)

2019-11-18 12:36:14
字體:
供稿:網(wǎng)友

  如何才能使用戶可以訪問您的應(yīng)用程序數(shù)據(jù),又不會(huì)將您的實(shí)體 bean 直接暴露給 Web 層,從而不會(huì)使您的應(yīng)用程序面臨安全性威脅?Brett McLaughlin 提供了一個(gè)解決方案,它可使您的實(shí)體 bean 很安全,并且使您的整個(gè)應(yīng)用程序有效率地運(yùn)行。
  
  EnterPRise javaBeans 技術(shù)一般分成三種核心類型的 bean:會(huì)話 bean、消息驅(qū)動(dòng) bean 和實(shí)體 bean。bean 還可以分成充當(dāng)業(yè)務(wù)對象的 bean 和充當(dāng)數(shù)據(jù)對象的 bean。會(huì)話 bean 和消息驅(qū)動(dòng) bean 是業(yè)務(wù)對象;實(shí)體 bean 是數(shù)據(jù)對象。大多數(shù)情況下,只需要將業(yè)務(wù)對象暴露給 Web 層(有時(shí)稱為應(yīng)用層),因?yàn)闃I(yè)務(wù)對象可以使用數(shù)據(jù)對象來處理數(shù)據(jù)存儲(chǔ)。但在有些情況下,有必要答應(yīng)用戶直接訪問和操作數(shù)據(jù)對象,這意味著要將實(shí)體 bean 暴露給 Web 層。這會(huì)使您的應(yīng)用程序面臨安全性威脅,而且隨著您的應(yīng)用程序的發(fā)展,還會(huì)導(dǎo)致雜亂無章的代碼。
  
  在這篇EJB最佳實(shí)踐的文章中,我們將討論為什么絕對不可以將實(shí)體 bean 暴露給應(yīng)用程序的 Web 層,以及為什么這是難以避免的。接著我將向您演示一個(gè)變通方法,它既能使您的實(shí)體 bean 更安全,又能使您的整個(gè)應(yīng)用程序更有效率。
  
  暴露的風(fēng)險(xiǎn)
  實(shí)體bean揭示了大量有關(guān)數(shù)據(jù)庫底層結(jié)構(gòu)的信息。因?yàn)槊總€(gè)bean都包含用于數(shù)據(jù)庫中的各個(gè)字段的取值(accessor)和賦值(mutator)方法(即,getxxx() 和 setxxx()),而且因?yàn)榉椒Q通常與字段名稱連在一起(User bean 中的 getFirstName() 通常訪問 Users表中的firstName字段),所以從應(yīng)用程序的實(shí)體bean推斷這個(gè)應(yīng)用程序的整個(gè)數(shù)據(jù)庫結(jié)構(gòu)是可能的。盡管在單個(gè)應(yīng)用程序中這可能不是什么大問題,但您的bean經(jīng)常會(huì)暴露給其它網(wǎng)絡(luò)上另外的應(yīng)用程序。在 Web 服務(wù)系統(tǒng)中尤其會(huì)發(fā)生這種情況,其中應(yīng)用程序都是跨多個(gè)網(wǎng)絡(luò)鏈接的。
  
  暴露的 bean:一個(gè)工作示例
  請考慮稱為Movie的實(shí)體bean。該bean的方法是getTitle()、getDirector()和getActors()。因?yàn)槟驯┞读嗽?bean 的遠(yuǎn)程接口,所以您的應(yīng)用程序和幾個(gè)客戶機(jī)應(yīng)用程序都編寫了合并 getDirector() 方法的代碼。但是,隨著應(yīng)用程序的發(fā)展,它應(yīng)該能接受由多位導(dǎo)演指導(dǎo)的電影,這一點(diǎn)很清楚。數(shù)據(jù)庫更改了,您的 getDirector() 方法變成了 getDirectors()。現(xiàn)在該方法是復(fù)數(shù)形式并被編碼為返回一個(gè)列表,而不是單一對象。其結(jié)果是,所有使用舊方法的代碼都將破壞,從而不得不重寫您的應(yīng)用程序代碼(以及您的客戶機(jī)應(yīng)用程序代碼)。
  
  除了存在使您數(shù)據(jù)庫結(jié)構(gòu)暴露給未知應(yīng)用程序的明顯危險(xiǎn)之外,您還應(yīng)該考慮當(dāng)數(shù)據(jù)結(jié)構(gòu)更改時(shí)會(huì)發(fā)生什么。因?yàn)閷?shí)體 bean 與您的數(shù)據(jù)結(jié)構(gòu)緊密地結(jié)合在一起,所以隨著數(shù)據(jù)庫表中列的更改或新列的添加,實(shí)體 bean 經(jīng)常要隨之更改。通過將您的實(shí)體 bean 暴露給應(yīng)用層,可以使它們的方法名稱可用,而且這些方法名稱幾乎總是被您的應(yīng)用程序和外部應(yīng)用程序合并到新的應(yīng)用程序代碼中。隨著您的實(shí)體 bean 的更改以及發(fā)展,就會(huì)出現(xiàn)嚴(yán)重的代碼混亂。
  
  會(huì)話虛包模式
  幸運(yùn)的是,有一個(gè)設(shè)計(jì)模式讓您答應(yīng)用戶訪問數(shù)據(jù)對象,同時(shí)又不會(huì)將實(shí)體 bean 暴露給 Web 層。會(huì)話虛包(session Facade)模式在實(shí)體 bean 和應(yīng)用程序客戶機(jī)之間放置了一個(gè)會(huì)話 bean。當(dāng)我通過這種方法使用會(huì)話 bean 時(shí),我喜歡把它當(dāng)作治理器,因?yàn)樗娜蝿?wù)是治理對其它實(shí)體的訪問。
  
  會(huì)話bean旨在充當(dāng)業(yè)務(wù)邏輯和應(yīng)用邏輯之間的接口。在我們的工作示例的例子中,邏輯極其簡單,而且它只調(diào)出一個(gè)底層實(shí)體 bean。然而在實(shí)際情況中,您可能會(huì)選擇讓會(huì)話 bean 治理數(shù)據(jù)驗(yàn)證、安全性或任何其它特定于業(yè)務(wù)的功能。通過將實(shí)體 bean 封裝在會(huì)話 bean 中,您可以訪問所有所需的業(yè)務(wù)功能,同時(shí)不會(huì)“污染”您的實(shí)體 bean 代碼。
  
  為了解決工作示例中的問題,您可以創(chuàng)建稱為 MovieManager 的會(huì)話 bean。MovieManager bean 將包含舊方法 getDirector() 和新方法 getDirectors()。當(dāng)添加了新方法時(shí),它只是被“代理”到您的實(shí)體 bean。因?yàn)榈谝粋€(gè)方法在實(shí)體 bean 中不再可用,所以會(huì)話 bean 使用助手方法來隱藏它,如清單 1 所示:
  
  清單 1. 隱藏已不使用的方法
  public Person getDirector() {
  // We can't call getDirector() any more on the entity bean
  // Call the new method, through this manager
  List directors = getDirectors();
  // Return the first one in the list
  return (Person)directors.item(0);
  }
  
  清單 1 的適用性不是非凡健壯,但它獲得了成功。因?yàn)殡[藏了舊方法(而不是刪除),所以所有與它相關(guān)的應(yīng)用程序代碼都一直存在。通過將助手方法放置在它所屬的業(yè)務(wù)對象中,您還將它排斥在實(shí)體 bean 之外。解決了這個(gè)緊急的問題后,您可以選擇將 bean 的客戶機(jī)手工移植到新方法,或讓助手方法一直處理移植工作。不管是哪種方法,都不會(huì)影響您的應(yīng)用程序代碼和您的客戶機(jī)代碼。
  
  隱藏?cái)?shù)據(jù)結(jié)構(gòu)
  盡管上面的解決方案確實(shí)解決了更改治理的問題,但它不能消除安全性問題。您仍需要保護(hù)實(shí)體bean(并由此保護(hù)您的數(shù)據(jù)結(jié)構(gòu)),以免暴露給Web層。通過向會(huì)話bean添加一些簡單的業(yè)務(wù)邏輯和數(shù)據(jù)操作功能,您不僅可以隱藏應(yīng)用程序的數(shù)據(jù)結(jié)構(gòu),還可以提供對它所包含的信息的更復(fù)雜訪問。
  
  例如,隨著應(yīng)用程序的發(fā)展,您可能發(fā)現(xiàn)讓用戶依次訪問各種數(shù)據(jù)對象(例如,導(dǎo)演、制片人、演員)的效率很低。因?yàn)檫@類信息幾乎總是被放在一起,并一起使用,所以您可能發(fā)現(xiàn)重新確定會(huì)話 bean 的用途會(huì)很有幫助。您的會(huì)話 bean 將不包含 getDirector() 或 getDirectors() 方法,而是包含了如清單 2 所示的新的業(yè)務(wù)邏輯:
  
  清單 2. 用會(huì)話 bean 掩蓋數(shù)據(jù)結(jié)構(gòu)
  public List getCrew(String movieName)
  throws NamingException, RemoteException {
  List crew = new LinkedList();
  EJBHomeFactory f = EJBHomeFactory.getInstance();
  MovieHome movieHome =
  (MovieHome)f.lookup("java:comp/env/ejb/Movie", MovieHome.class);
  Movie movie = movieHome.findByName(movieName);
  crew.add(movie.getDirectors());
  crew.add(movie.getProdUCers());
  crew.add(movie.getExecutiveProducers());
  // and so on...
  return crew;
  }
  public List getCast(String movieName)
  throws NamingException, RemoteException {
  List cast = new LinkedList();
  EJBHomeFactory f = EJBHomeFactory.getInstance();
  MovieHome movieHome =
  (MovieHome)f.lookup("java:comp/env/ejb/Movie", MovieHome.class);
  Movie movie = movieHome.findByName(movieName);
  crew.add(movie.getActors());
  crew.add(movie.getStandIns());
  // and so on...
  return cast;
  }
  
  通過分離不同的應(yīng)用程序?qū)樱约笆褂脴I(yè)務(wù)邏輯來處理數(shù)據(jù)操作,您既阻止了對實(shí)體 bean 直接而且可能不安全的訪問,又為您的 Web 層創(chuàng)建了更有意義的方法集。本例中,會(huì)話虛包充當(dāng)了實(shí)體 bean 的封裝器以及真正的業(yè)務(wù)邏輯單元,從而將原始數(shù)據(jù)轉(zhuǎn)變成有意義的信息。
  
  會(huì)話虛包模式是許多其它設(shè)計(jì)模式的基本構(gòu)件,其優(yōu)點(diǎn)遠(yuǎn)遠(yuǎn)不止這里所討論的。在 EJB 最佳實(shí)踐的下一篇專欄文章中,我們將使用本系列的第一篇技巧文章中研究的業(yè)務(wù)接口(Business Interface)模式,以及您在這里了解到的某些訣竅來進(jìn)一步抽象出使用您應(yīng)用程序中所有類型 EJB 組件的過程。
  
  要避免的解決方案
  解決所描述的這類問題的一個(gè)常見解決方案是簡單地將助手方法添加到實(shí)體bean本身。但這樣做的后果可能是災(zāi)難性的。即使您實(shí)體bean中的每個(gè)方法每年只更改一次,但bean會(huì)在那年結(jié)束時(shí)將擁有雙倍數(shù)量的方法。當(dāng)您考慮方法不只是每年更改一次,而是以頻繁得多的頻率更改時(shí),為什么這個(gè)“邦迪式(Band-Aid)”方法不起作用就很明顯了。當(dāng)實(shí)體bean看上去不再象數(shù)據(jù)對象而開始象助手類時(shí),您知道您已經(jīng)有問題了。另一方面,會(huì)話 bean 經(jīng)常看上去十分象助手類,因?yàn)槟鞘菚?huì)話 bean 旨在實(shí)現(xiàn)的功能之一。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 霍邱县| 南华县| 德昌县| 余庆县| 东乡县| 敦煌市| 城固县| 策勒县| 镇远县| 寿阳县| 密山市| 琼中| 开江县| 潜山县| 延津县| 丽水市| 都安| 乌拉特前旗| 泰和县| 万荣县| 仙桃市| 郓城县| 家居| 信丰县| 建水县| 苏尼特左旗| 慈利县| 二手房| 马公市| 合水县| 和硕县| 霞浦县| 辉县市| 金寨县| 彭阳县| 兴山县| 图们市| 永丰县| 林州市| 平定县| 达拉特旗|