|
|
/////////////问题描述:///////////// 在struts中Action是进行业务处理的中心,它最好不要理会其它的事情,大家知道在Struts框架中,ActionServlet接收用户的请求,它会根据request.getServletPath()值去struts-config.xml中那找对应的一个Action类,然后进行繁索并且无用的二次封装过程(你不信的话,看看它的源码吧,看得我头发晕),因为这部分的处理是我们不需要,因为我们不需要进行业务处理,但它按照它自已的思想先给你提供了业务处理的前期准备. 我们就来说说如何减少这部分的性能损失(也就是如何除去ActionServlet中不必要的为业务处理进行的前期准备工作).
/////////////方案:///////////// 下面写的其实也是我们的项目中正在使用的方案:-) 其实很简单,我想大家都能做得到,就是继承ActionServlet并重写它的process方法(doGet/doPost都调用了该方法),就是回避了原来的无效处理,采取直接的分发方式(因为这部分资源请求,无需进行业务处理).或许你会说,不如提供一个href="xxx/xx.htm"罢了,非也,因为我们的项目中要求对所有的可存取资源要进行存取权限的验证,所以直接的href达不到项目的需求要求.(或许你正在实施的项目也存在这样的问题,你或许已照搬了struts的架构中的处理过程,若你感觉sturts中那个已固定的处理过程你已厌倦了,请你向下看)
下面对于项目中需要进行业务处理的请求,我们需要按照Struts那一套进行处理的内容,在此不进行讨论,只对那些不需要进行业务处理的请求进行分析. /////////////具体实施:///////////// 我们的项目中要求对所有的可存取资源要进行存取权限的验证,但项目的实施中我们又要尽可以提高系统的性能,开发时要求以struts来实现,结合以上的要求,我对系统中的请求分为两类,一类是需要进行业务处理的请求(这部分在此不讨论),另一类是不需要进行业务处理的请求(如一些通知,帮助页面等),请你要注意我不能直接通过href实现,我也想啊,但达不到要求啊??!! 我还是以一个请求来进行示例吧,如应用中有一个请求,查看公司内部当天的通知信息,资源页面在/info/todayinfo.htm我对此类的请求定义了一个链接规则,就是不需要进行业务处理的那部分请求在改变它的请求路径:在一个完整的请求后再上do,如上面的那个请求我用/info/todayinfo.htmdo代替,用户只能进行*.htmdo式的请求(这意味都你必须经过我的权限逻辑验证这一关),当你以*.htm的形式进行请求,我会拦截所有这类请求,返回一个null给你,视它为一个不安全的访问.
附上我的部分代码: AuthenticateActionServlet.java ----进行权限验证的类,它捕获所有*.htmdo请求,验证后将请求分发到destination /////////////////////////NoAuthentivateActionServlet.java///////////////////// //在这里我们将ActionSerlvet中所有无用的东西屏蔽掉(即:将用于为业务处理准备数据的那部 //分的无效处理去除,性能损失将降到最低.
-
- public void process(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- String path=request.getServletPath();
- RequestDispatcher dispatcher=null;
-
- if(path.toLowerCase().endsWith(".jspdo")) {
- path=path.substring(0,path.indexOf("."))+".jsp";
- }else if(path.toLowerCase().endsWith(".htmdo")) {
- path=path.substring(0,path.indexOf("."))+".htm";
- }else if(path.toLowerCase().endsWith(".htmldo")) {
- path=path.substring(0,path.indexOf("."))+".html";
- }
- //进行权限监控
- if(! authenticate(request)){
- path="/error/ErrorMessage.htm";
- }
- try {
- dispatcher=this.getServletContext().getRequestDispatcher(path);
- }
- catch (Exception ex) {
-
- }
- dispatcher.forward(request,response);
- }
- /**
- * 权限监控处理
- */
- private boolean authenticate(HttpServletRequest request){
- //do something
- return true;
- }
//////////////////////////////web.xml/////////////////////////////////////
-
- <servlet id="servlet_1">
- <servlet-name>NoAuthentivateActionServlet</servlet-name>
- <servlet-class>com.ketty.web.AuthentivateActionServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>NoAuthentivateActionServlet</servlet-name>
- <url-pattern>*.jspdo</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>NoAuthentivateActionServlet</servlet-name>
- <url-pattern>*.htmdo</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>NoAuthentivateActionServlet</servlet-name>
- <url-pattern>*.htmldo</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>NoAuthentivateActionServlet</servlet-name>
- <url-pattern>*.jsdo</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>NoAuthentivateActionServlet</servlet-name>
- <url-pattern>*.cssdo</url-pattern>
- </servlet-mapping>
////////////////////////////////////////////////////////////////////////////// 以上的代码可以作用于其它的任何资源上:如jsp/html/js/css你可以自行进行扩展 :-) 以上是本人的一点浅见,如有不对之处,希望高手指点(若你认为是垃圾就当没有看见吧,反正我们项目中是这样进行实施的,我只说出我想说的,让别人去说吧)!! |
|