tomcat利用外观模式保护数据
2015-04-22 09:23
295 查看
外观模式其实就是将细粒度的对象包装成粗粒度的对象。举个现实的例子,有四台电脑可以随便访问,可能客户a要访问第一台和第二台,客户b要访问第二台和第三台....这种情况下互相间的调用关系是和复杂的。外观模式就好比我通过一台路由器连接了四台电脑,这样客户统一通过路由器去访问需要访问的电脑。这样就大大加强了系统的易用性和可维护性。
外观模式还有一个作用就是可以保护底层对象的数据,tomcat在设计时就利用到了这一点。一个简单的servlet处理器uml图如下:
ServletProcess1的process方法用来处理servlet请求,该方法接收实现servletRequest和servletResponse接口的request和response,里面存放着请求信息和响应信息。process方法如下:
这里的servlet其实就是request所要请求的servlet方法,就是我们在web编程时自己新建的一个servlet方法。那么问题就来了,作为tomcat用户的web程序员在servlet的service方法中接收到了由request和response向上转型而来的servletRequest和servletResponse。web程序员就可以将servletRequest和servletResponse向下转型为request和response,这样web程序员就可以调用request和response中的一些处理方法,而这些方法自然是不应该被用户调用的。这里便可以通过外观模式保护request和response中的数据和方法。
外观类设计的uml如下:
RequestFacade类的定义如下:
外观模式还有一个作用就是可以保护底层对象的数据,tomcat在设计时就利用到了这一点。一个简单的servlet处理器uml图如下:
ServletProcess1的process方法用来处理servlet请求,该方法接收实现servletRequest和servletResponse接口的request和response,里面存放着请求信息和响应信息。process方法如下:
import java.net.URL; import java.net.URLClassLoader; import java.net.URLStreamHandler; import java.io.File; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class ServletProcessor1 { public void process(Request request, Response response) { String uri = request.getUri();//获取uri的方法 String servletName = uri.substring(uri.lastIndexOf("/") + 1); URLClassLoader loader = null; try { // create a URLClassLoader URL[] urls = new URL[1]; URLStreamHandler streamHandler = null; File classPath = new File(Constants.WEB_ROOT); // the forming of repository is taken from the createClassLoader method in // org.apache.catalina.startup.ClassLoaderFactory String repository = (new URL("file", null, classPath.getCanonicalPath() + File.separator)).toString() ; // the code for forming the URL is taken from the addRepository method in // org.apache.catalina.loader.StandardClassLoader class. System.out.println("repository:"+repository); urls[0] = new URL(null, repository, streamHandler); loader = new URLClassLoader(urls); } catch (IOException e) { System.out.println(e.toString() ); } Class myClass = null; try { myClass = loader.loadClass(servletName); } catch (ClassNotFoundException e) { System.out.println(e.toString()); } Servlet servlet = null; try { servlet = (Servlet) myClass.newInstance(); <span style="color:#ff0000;"> servlet.service((ServletRequest) request, (ServletResponse) response);</span> } catch (Exception e) { System.out.println(e.toString()); } catch (Throwable e) { System.out.println(e.toString()); } } }注意其中红色的代码部分,这里将request和response直接向上转型为servletRequest和servletResponse传给了servlet的services方法。
这里的servlet其实就是request所要请求的servlet方法,就是我们在web编程时自己新建的一个servlet方法。那么问题就来了,作为tomcat用户的web程序员在servlet的service方法中接收到了由request和response向上转型而来的servletRequest和servletResponse。web程序员就可以将servletRequest和servletResponse向下转型为request和response,这样web程序员就可以调用request和response中的一些处理方法,而这些方法自然是不应该被用户调用的。这里便可以通过外观模式保护request和response中的数据和方法。
外观类设计的uml如下:
RequestFacade类的定义如下:
import java.io.IOException; import java.io.BufferedReader; import java.io.UnsupportedEncodingException; import java.util.Enumeration; import java.util.Locale; import java.util.Map; import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class RequestFacade implements ServletRequest { private ServletRequest request = null; public RequestFacade(Request request) { this.request = request;//将servletrequest接口具体对应到request中 } /* implementation of the ServletRequest*/ public Object getAttribute(String attribute) { return request.getAttribute(attribute); } ......... }外观类的作用就是将Request向上转型为ServletRequest,并用直接调用的方式实现接口。外观类实现了ServletRequest的所有方法,且通过将ServletRequset设置为private类型屏蔽掉了Request类中的一些数据和方法。通过外观类,我们只要在process方法中做一点修改就可以保证web程序员在实现service方法时无法访问Request的敏感数据和方法:
RequestFacade requestFacade = new RequestFacade(request);//在requestfacade中将request强制转化为servletrequest ResponseFacade responseFacade = new ResponseFacade(response); try { servlet = (Servlet) myClass.newInstance(); servlet.service((ServletRequest) requestFacade, (ServletResponse) responseFacade); }通过上面的方式,在service接收到的ServletRequest和ServletResponse只能向下转型为RequestFacade和ResponseFacade。而外观类已经屏蔽掉了Request和Response中的敏感方法和数据,从而实现了数据安全。
相关文章推荐
- 利用公用体的特性来确定CPU的数据对齐的端模式
- EF Core利用Transaction对数据进行回滚保护
- 利用MySQL加密函数保护Web网站敏感数据
- 操作系统以外的硬盘空间-利用DOS/WINDOWS9X的隐含扇区保护数据 - 企鹅人生 - CSDNBlog
- 诺基亚测试利用区块链保护健康数据
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- 利用mysql加密函数保护web网站敏感数据
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- 如何利用MySQL加密函数保护Web网站敏感数据
- 一步一步学DataGuard(22)Standby之选择数据保护模式
- 利用MySQL加密函数保护Web网站敏感数据的方法分享
- C++友元friend ——利用friend修饰符,可以让设定的外部函数访问对象中被保护数据
- 云计算数据保护模式也该引入第三方保障
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- 利用PHP的OOP特性实现数据保护(1)
- 利用python进行数据分析——p26,"一定要以pylab模式”打开如何解决
- 利用Delegator模式保护javascript程序的核心与提高执行性能 (转)
- C#网络Socket的数据发送与接收处理(利用异步)的模板(模式)
- C#网络Socket的数据发送与接收处理(利用异步)的模板(模式)