使用时间戳解决ie缓存的问题,请求加时间戳防止
分类:关于美高梅

在开发测试中,如果选择ie,当编辑某条数据时,再回过头来进行编辑,会发现,里面的数据和没有编辑以前是一样的, 这和种情况下,解决ie缓存成了问题。我的方法是,在请求链接后面加上一个时间戳,就只可以避免这种问题的出现。

使用时间戳解决ie缓存的问题,戳解决ie缓存

在开发测试中,如果选择ie,当编辑某条数据时,再回过头来进行编辑,会发现,里面的数据和没有编辑以前是一样的, 这和种情况下,解决ie缓存成了问题。我的方法是,在请求链接后面加上一个时间戳,就只可以避免这种问题的出现。

复制代码 代码如下:

var getTimestamp=new Date().getTime(); //时间戳
var _url = "${pageContext.request.contextPath}/productData/addShow.do?productDataId="+value+"&timer="

  • getTimestamp;

项目开发过程中遇到的一个case,做了三个弹窗,根据后台返回数据中的两个字段:
firstView和upgrade的值来进行判断,是否需要弹窗以及弹哪个窗,其中firstview的值在指定的时间段内首次点开页面会返回true值,第二次请求该接口就会返回false,现在要解决的就是,当第一次点开页面fristvieW返回了true,成功弹窗后,进入其他页面,当点击返回按钮是,客户端会缓存刚才的请求数据,重新拿到true值,从而触发又一次的弹窗,这是不符合业务逻辑的,解决方法就是,在请求的后面加时间戳,使得只要是渲染指定页面,就发起一个全新的请求,不让浏览器使用缓存的数据:、

很感谢公司的大神,不厌其烦的进行指导,在大神的帮助下终于写完了。。

复制代码 代码如下:

用EXTJS 怎清除浏览器缓存

一般都是加时间戳,如果还是只执行一次,那就要看你的代码逻辑了,加时间戳后不会出现缓存问题了的  

知识点:

写一个将时间段转换取并集合并的一个工具类,写了四五次,醉了

var getTimestamp=new Date().getTime(); //时间戳
var _url = "${pageContext.request.contextPath}/productData/addShow.do?productDataId="+value+"&timer="

高分助:js缓存问题,急

因为IE的缓存,使得我们在填入相同的值的时候总是使用IE缓存,为了解决这个问题一般可以用一下方法:
1:在ajax或者dwr提交的url后面加时间戳。
例如
http_request.onreadystatechange = funcName(函数名);
http_request.open("GET", url, true);
比如url是test .jsp
那么我们在它后面加上?time=new Date();
即url=test.jsp?time=new Date();
2 :在url后面加一个随机数。
。。。。。。。。。
url=test.jsp?number=Math.random();

因为时间和随即数是提交一次变一次,所以每次提交的都不是相同的,他就会当做一个新的请求去执行了  

在开发测试中,如果选择ie,当编辑某条数据时,再回过头来进行编辑,会发现,里面的数据和...

浏览器缓存是基于url进行缓存的,如果页面允许缓存,则在一定时间内(缓存时效时间前)再次访问相同的URL,浏览器就不会再次发送请求到服务器端,而是直接从缓存中获取指定资源。

第一次代码的问题在与:命名不规范,避免使用 String s 之类的,用有实际意义的命名

  • getTimestamp;

function timestamp(url){
// var getTimestamp=Math.random();
var getTimestamp=new Date().getTime();
url=url+"?timestamp="+getTimestamp
return url;
}

修改后 第二次代码如下:

public static List<String> union(List<String> period) {
List<String> resultPeriod = new ArrayList<String>();

for(int i = 0;i < period.size();i++){
  if (period.get(i) == null) continue;
  String[] outerPeriods = period.get(i).split("-");
  Arrays.sort(outerPeriods);
  for(int j = 0;j < period.size();j++){
    if (period.get(j) == null) continue;
    String[] innerPeriod = period.get(j).split("-");
    Arrays.sort(innerPeriod);
    // if (strs1[0].equals(strs2[0]) && strs1[1].equals(strs2[1])) continue;
    if (outerPeriods[0].compareTo(innerPeriod[1]) <= 0 && outerPeriods[1].compareTo( innerPeriod[0]) >= 0){
      String string = null;
      if (outerPeriods[0].compareTo(innerPeriod[0]) < 0){
        string = outerPeriods[0] + "-" + innerPeriod[1];
      }else{
        string =innerPeriod[0] + "-" + outerPeriods[1];
        }
      period.set(j, null);
      period.set(i, string);
      }
   } 
  if (period.get(i) != null)
  resultPeriod.add(period.get(i));
}
System.out.println(resultPeriod.toString());
return resultPeriod;
}

第二次代码的问题在于: 对时间段进行比较,不要用字符串比较,最好转成时间或者时间戳进行比较,虽然字符串的ascii码比较也是没有问题的,尽量避免for循环里面 try-catch

修改之后 第三次代码如下:

public static List<String> union(List<String> period) {
  List<String> resultPeriod = new ArrayList<String>();
  for(int i = 0;i < period.size();i++){
    if (period.get(i) == null) continue;
    Long[] outerDate = getTimestamp(period.get(i).split("-"));
    Arrays.sort(outerDate);
    for(int j = i;j < period.size();j++){
      if (period.get(j) == null) continue;
美高梅网址,      Long[] innerDate = getTimestamp(period.get(j).split("-"));
      Arrays.sort(innerDate);
      Long outerStart = outerDate[0];
      Long outerEnd = outerDate[1];
      Long innerStart = innerDate[0];
      Long innerEnd = innerDate[1];

      if (outerStart.equals(innerStart) && outerEnd.equals(innerEnd)) continue;
      if (outerStart.compareTo(innerEnd) <= 0 && outerEnd.compareTo(innerStart) >= 0){
        String mergeRes;
        if (outerStart.compareTo(innerStart) < 0){
          mergeRes = getDate(outerStart) + "-" + getDate(innerEnd);
        }else{
          mergeRes =getDate(innerStart) + "-" + getDate(outerEnd);
         }
        period.set(j, null);
        period.set(i, mergeRes);
       }
      }
      if (period.get(i) != null)
      resultPeriod.add(period.get(i));
    }
    System.out.println(resultPeriod.toString());
    return resultPeriod;
  }
}

public static Long[] getTimestamp(String[] periods){
  Long[] date = new Long[2];
  try{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
    for(int i = 0 ; i < periods.length ; i++){
    date[i] = sdf.parse(periods[i]).getTime();
    }
  } catch (ParseException e) {
    e.printStackTrace();
  }
  return date;
}

public static String getDate(Long timestamps){
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
  return sdf.format(timestamps);
}

第三次代码的问题在于: 使用的两次for循环进行比较,而且会在循环的时候更改数据,最好不要在循环的时候改数据,而且可以通过一次循环实现此需求

修改之后的第四次代码如下:

public static List<String> union(List<String> period) {
  Collections.sort(period);
  List<String> resultPeriod = new ArrayList<String>();
  for(int i = 0;i < period.size();i++){
    if(i == period.size() - 1){
    resultPeriod.add(period.get(i));
    continue;
  }
  Long[] frontTimes = getTimestamp(period.get(i).split("-"));
  Long[] behindTimes = getTimestamp(period.get(i+1).split("-"));
  Long frontStart = frontTimes[0];
  Long frontEnd = frontTimes[1];
  Long behindStart = behindTimes[0];
  Long behindEnd = behindTimes[1];

  if (frontStart.compareTo(behindEnd) <= 0 && frontEnd.compareTo(behindStart) >= 0){
    String mergeRes = getDate(frontStart) + "-" + getDate(behindEnd);
    period.set(i+1, mergeRes);
  }else{
    resultPeriod.add(period.get(i));
    }
  }
  System.out.println(resultPeriod.toString());
  return resultPeriod;
}

第四次代码的问题在于: 1.依然有对原集合进行修改的操作,尽量避免;2.工具类一般不处理异常,直接抛出去;3.SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");会耗费很长的时间,最好不要在for循环里面操作,但是也最好不要写成静态的,因为SimpleDateFormat是线程不安全的,static多个线程共享一个某些时候回出现问题,具体参考(

第五次修改代码如下:

public static List<String> union(List<String> period) throws ParseException{
  Collections.sort(period);
  List<String> resultPeriod = new ArrayList<String>();
  String currentPeriod = period.get(0);
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

  for(int i = 0;i < period.size();i++){
    Long[] currentTimes = getTimestamp(currentPeriod.split("-"), sdf);
    Long[] nextTimes = getTimestamp(period.get(i).split("-"), sdf);
    Long currentStart = currentTimes[0];
    Long currentEnd = currentTimes[1];
    Long behindStart = nextTimes[0];
    Long behindEnd = nextTimes[1];

    if (currentEnd < behindStart){
      resultPeriod.add(currentPeriod);
      currentPeriod = period.get(i);
    }else {
      List<Long> timePoints = new ArrayList<Long>();
      timePoints.add(currentStart);
      timePoints.add(currentEnd);
      timePoints.add(behindStart);
      timePoints.add(behindEnd);
      Collections.sort(timePoints);
      currentPeriod = getDate(timePoints.get(0)) + "-" + getDate(timePoints.get(timePoints.size() - 1));
      }
     }
     resultPeriod.add(currentPeriod);
     return resultPeriod;
   }

   private static Long[] getTimestamp(String[] periods, SimpleDateFormat sdf) throws ParseException{
   Long[] date = new Long[periods.length];
   for(int i = 0 ; i < periods.length ; i++){
   date[i] = sdf.parse(periods[i]).getTime();
  }
  return date;
}

private static String getDate(Long timestamps){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
return sdf.format(timestamps);
}

 

大神说马马虎虎可以提交了

 

本文由美高梅网址发布于关于美高梅,转载请注明出处:使用时间戳解决ie缓存的问题,请求加时间戳防止

上一篇:推荐10款最热门jQuery 下一篇:没有了
猜你喜欢
热门排行
精彩图文