Jaytse的专栏

欢迎来到JAY的CSDN

小米ID:jaytse
27555次访问,排名4140好友0人,关注者0
混吃等死
jaytse的文章
原创 54 篇
翻译 0 篇
转载 20 篇
评论 11 篇
Jaytse的公告
最近评论
vivi5566:你blog的风格好那啥啊
yevv:洋洋洒洒 :)
csdn blog 编辑:您好,
我是CSDN 博客周刊编辑,我们在我们的CSDN 博客周刊中使用了您的文章,希望您有时间可以来看看。
地址是:http://blog.csdn.net/blogweekly/
Brent:呵呵,好,我也要回去写一篇~~~

嘿,哥们,过奖我了,不过看了之后真觉得你好“虚伪”诶,呵呵,隐藏的这么深,还整天乐呵呵的给我们表像,你这朋友交定了!
yevv:好长一串 嘿嘿 :)
文章分类
收藏
    相册
    北京之行
    未央湖
    在华山
    设计模式
    设计模式(Patterns in Java)
    学生时代
    东北电力学院
    西安交通大学
    衣食父母
    IBM CSDL
    中科院软件所
    广州傲思(已经倒了)
    友情支持
    our ifa's blog
    yevv's blog
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 DWR框架下修改OSCache的Key以适应域名和IP的两种访问方式收藏

    新一篇: IM配置说明 | 旧一篇: 项目中遇到的几个知识点总结

    问题描述

    利用OSCache以Filter形式作为缓存以减少服务器压力的时候,客户端对服务器的每次请求不必从服务器调用而后才得到反馈结果,而是从缓存中提取内容返回给客户端即可。在OSCache中提供了一种Key和Value的Map映射,即对每次HTTP请求作为一个Item(可以在把OSCache作为Filter应用的Web工程中的web.xml中配置哪些经过此Filter),将其请求地址和实际内容进行缓存以供将来使用。当第一次进行缓存后,以后每次请求便根据请求的Key从缓存中读取相应的内容了。

    当某一应用在实际上线运行时,便提供了域名和IP两种访问方式。当以某一种方式,进行访问的是时候,例如域名访问,OSCache就会把它提供默认的Http请求地址作为Key,即servletPath + pathInfo + queryString,进行缓存。第二次请求开始时候,便根据Key从缓存中查找并返回相应的内容。

    而另一方面在利用Ajax框架DWR进行远程调用时候是禁止跨域访问的。而OSCache的这种忽略BashURL(schema + serverName + port + contentPath)提供Key的方式这就造成了Ajax认为出现了跨越访问,从而浏览器报错:XMLHttpRequest禁止跨域访问等错误。其根本原因在于同一个应用有两种访问方式和OSCache的不恰当的Key的提供方式。但在单机测试不提供域名访问的情况下,是很难发现这种错误的。

    解决方法

       通过上面的分析,只需要修改OSCache的默认KeyProvider即可,思路很直接:把每次请求的全部地址作为Key即可。具体代码如下:

    import javax.servlet.http.HttpServletRequest;

    import com.opensymphony.oscache.base.Cache;
    import com.opensymphony.oscache.web.ServletCacheAdministrator;
    import com.opensymphony.oscache.web.filter.ICacheKeyProvider;

    public class URLCacheKeyProvider implements ICacheKeyProvider {

        
    public String createCacheKey(HttpServletRequest httpRequest, ServletCacheAdministrator scAdmin, Cache cache){
            String key 
    = getFullURL(httpRequest);
            System.out.println(
    "key = " + key);
            
    return key;
        }

        
        
    private String getFullURL(final HttpServletRequest request){
            String serverSchema 
    = request.getScheme();
            
    int serverPort = request.getServerPort();
            
            
    boolean isDefaultPort = ( (serverSchema.equals("http"
                                   && (serverPort == 80)) 
                                   || (serverSchema.equals("https"
                                   && (serverPort == 443)));
            String fullURL 
    = "";
            
            String baseString 
    = serverSchema + "://" 
                            + request.getServerName() 
                            + (isDefaultPort ? "" : (":" + serverPort)) 
                            + request.getContextPath();
            
            fullURL 
    = baseString 
                  + request.getServletPath() 
                  + request.getPathInfo() 
                  + ((request.getQueryString() == null? "" : "?" 
                  + request.getQueryString());
            
            
    return fullURL;
        }


    }

    发表于 @ 2008年04月24日 13:35:00|评论(loading...)|编辑

    新一篇: IM配置说明 | 旧一篇: 项目中遇到的几个知识点总结

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © Jaytse