java清除浏览器缓存[通俗易懂]

java清除浏览器缓存[通俗易懂]方法一:<%response.setHeader(“Pragma”,”No-cache”);response.addHeader(“Cache-Control”,”must-revalidate”);response.addHeader(“Cache-Control”,”no-cache”);response.addHeader(“Cache-Control”,”no-store”);response.setDateHeader(“Expires”,0)…

大家好,又见面了,我是你们的朋友全栈君。

清理网站缓存的几种方法

方法一:

<%response.setHeader("Pragma","No-cache"); 
response.addHeader( "Cache-Control", "must-revalidate" );
response.addHeader( "Cache-Control", "no-cache" );
response.addHeader( "Cache-Control", "no-store" );
response.setDateHeader("Expires", 0); 
response.flushBuffer();%>

注意:单纯的使用 response.setRequestHeader(“Cache-Control”,”no-cache”)无效。

 

Cache-Control头域
      Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:
      Public:指示响应可被任何缓存区缓存。
      Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
      no-cache:指示请求或响应消息不能缓存
      no-store:用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
      max-age:指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
      min-fresh:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
      max-stale:指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

 

 

方法二:META方法

给页面头部<head>中添加如下代码:

<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> 
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> 
<META HTTP-EQUIV="Expires" CONTENT="0">

http头部信息:”Expires”和”Cache-Control”为应用程序服务器提供了一个控制浏览器和代理服务器上缓存机制 。http头信息Expires告诉代理服务器缓存页面过期时间。http1.1规范中新定义的头部信息Cache-Control可以通知浏览器不缓存任何页面,每次浏览器重新访问服务器获取页面;

no-cache:强制缓存从服务器上获取新页面

no-store:在任何环境下缓存不保存任何页面

 

方法三:给每个url加参数

在需要打开的url后面增加一个随机数:random():这样每次请求url后面参数不一样,相当于请求的是不同多的页面,用这种方式也是可以达到我们的要求;

URL 参数后加上 "?ran=" + Math.random(); //当然这里参数 ran可以任意取了

 

但是一个个页面添加比较麻烦,毕竟上面方式还是有缺陷的,每个页面加载,这样在我们后面项目稳定后如果还是使用的话,就会影响程序给用户带来的体验了,现在我们主要是看看怎么通过java代码来全局控制缓存,我使用的方法是过滤器,在页面请求的时候,对请求的资源加上参数,代码如下:

 

1.使用filter加载http头:

package com.taiji.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "HttpheadFilter", urlPatterns = { "/*" })
public class HttpheadFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //response对象
        HttpServletResponse res = (HttpServletResponse) response;
        // 设定网页的到期时间,一旦过期则必须到服务器上重新调用
        res.setDateHeader("Expires", -1);
        // Cache-Control 指定请求和响应应遵循的缓存机制 no-cache指示请求或响应消息是不能缓存的
        res.setHeader("Cache-Control", "no-cache");
        // 用于设定禁止浏览器从本地缓存中调用页面内容,设定后一旦离开页面就无法从Cache中再调出
        res.setHeader("Pragma", "no-cache");
        // 放行
        chain.doFilter(request, res);
    }

    @Override
    public void destroy() {

    }
}

 

2.是使用filter给url加参数;

package com.taiji.filter;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@WebFilter(filterName = "CacheCleanFilter", urlPatterns = { "/*" })
public class CacheCleanFilter implements Filter {

    private static Logger log = LoggerFactory
            .getLogger(CacheCleanFilter.class);
    private static final String STATIC_TAIL = "__xxxx_t=";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    //给url加参数
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        // 1.获取request请求的url访问路径
        String reqeustURL = req.getRequestURL().toString();
        String queryStr = req.getQueryString();

        // 2.通过给静态资源添加时间戳,去避免缓存问题
        // 当访问的静态资源是以*.js,*.css,*.html结尾时才给其加上时间戳
        if (reqeustURL != null) {
            if (checkURL(reqeustURL)) {
                String newURL = null;
                // 日期类型时间戳
                // String date = DateUtil.date2String(new Date(), "yyyyMMdd");
                // 毫秒值风格时间戳
                String date = new Date().getTime() + "";
                // 如果?后面有参数
                if (StringUtils.isNotBlank(queryStr)&& queryStr.trim().indexOf(STATIC_TAIL) == -1) {
                    newURL = reqeustURL + "?" + queryStr + "&" + STATIC_TAIL
                            + date;
                    newURL = newURL.replaceAll("\\n\\r", "");
                    resp.setHeader("content-type",
                            "text/application;charset=UTF-8");
                    resp.sendRedirect(newURL);
                }
                // 如果?后面没有参数
                if (StringUtils.isBlank(queryStr)) {
                    newURL = reqeustURL + "?" + STATIC_TAIL + date;
                    newURL = newURL.replaceAll("\\n\\r", "");
                    resp.setHeader("content-type",
                            "text/application;charset=UTF-8");
                    resp.sendRedirect(newURL);
                }

                if(!StringUtils.isBlank(queryStr)&&!(StringUtils.isNotBlank(queryStr)&& queryStr.trim().indexOf(STATIC_TAIL) == -1)){
                    try {
                        // 只要请求url不为空放行
                        chain.doFilter(request, response);
                    } catch (Exception e) {
                        e.printStackTrace();
                        log.info("[http请求出现异常,检查网络是否正常,或者再尝试一次![exception:]"
                                + e);
                    }
                }
            }
            else
            {
                try {
                    // 只要请求url不为空放行
                    chain.doFilter(request, response);
                } catch (Exception e) {
                    e.printStackTrace();
                    log.info("[http请求出现异常,检查网络是否正常,或者再尝试一次![exception:]"
                            + e);
                }
            }

        }
    }

    /**
     * @description:判断url中是否包含这些后缀名
     * @param url
     *            访问的url路径
     * @return
     */
    public Boolean checkURL(String url) {
        String[] checks = { ".js", ".css", ".jsp",".html" };
        for (int i = 0; i < checks.length; i++) {
            if (url.endsWith(checks[i])) {
                return true;
            }
        }
        return false;
    }

    /**
     * @description:解决302问题未解决)
     * @param
     * @param response
     */
    public void fixResponse(HttpServletResponse response) {
        response.setCharacterEncoding("UTF-8");
        response.setHeader("content-type", "text/application;charset=UTF-8");
        response.setStatus(200);
        try {
            PrintWriter out = response.getWriter();
            out.write("<html lang='zh-CN'>"
                    + "<head><meta http-equiv='content-type' content='text/html;charset=UTF-8'/></head></html>");
        } catch (IOException e) {
            e.printStackTrace();
            log.info("[浏览器或系统出现异常,请重新访问]-[zengwei]");
        }
    }


    @Override
    public void destroy() {

    }
}

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/161129.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • JavaScript d3使用指南

    JavaScript d3使用指南JavaScriptd3使用指南1.如何在项目中使用d3:如果是要在网站上使用d3效果的话,那么可以直接在script中引用官方直接给的网络库<scriptsrc=”https://d3js.org/d3.v5.js”></script>如果要在本地运行或者调试,亦或者自己搭建服务器,可以直接下载到本地进行使用。<script>src=”path/…../d3.js”</script>(这个script可以单独成行)官网:

    2022年10月25日
  • 工程师的基本功是什么?如何练习?—学习心得分享「建议收藏」

    开头聊几句1、周末休息,今天下雨了,气温还行,不冷不热2、刚看完《这!就是街舞》,很燃很炸,一些作品表达的东西也很让人感动3、发现真正热爱的事情,并为之付出所有的能量,很让人羡慕开头周四上线到比较晚,好在中间有空,去公司楼下湖边散了散步,上线回到家,已经是凌晨了。周五中午在去公司的路上看到了美团技术团队的一篇文章,觉得很不错,值得学习,也分享到朋友圈了,希望保留下方便自己查阅,也分享给更多的技术伙伴,一起看好的文章。在技术之路上,不断的持续学习,持续进步,一起精进。那天朋友圈分享美团的这

  • C++学习——继承与派生「建议收藏」

    C++学习——继承与派生「建议收藏」普通继承例题:定义一个名为Phone的手机类,有如下私有成员变量:品牌、型号、CPU、电池容量,如下成员函数:构造函数初始化手机的信息。在此基础上派生出NewPhone类,派生类增加了两个新的私有数据成员,分别用于表示颜色和价格,增加了一个成员函数用来输出手机信息。代码如下:#include <iostream>#include<string>#include&l…

  • 使用docker启动mysql8.0挂载配置文件_docker的特点

    使用docker启动mysql8.0挂载配置文件_docker的特点使用docker启动MySQL8.0因为mysql8对登录密码的加密方式做了调整,所以每次安装完mysql都要去翻翻教程,特此记录下,方便以后查看docker启动脚本#!/bin/bashdockerrm-fmysql8dockerrun–namemysql8\-eMYSQL_ROOT_PASSWORD=123456\-v/usr/local/mysql/logs:/logs\-v/usr/local/mysql/data:/var/lib/mys

  • Python 进制转换函数及前缀截取

    Python 进制转换函数及前缀截取“人生苦短,我用Python”,强大的Python肯定也自己内置的进制转换函数。十进制转其他进制:10进制数s:a=bin(s)//十进制转2进制b=oct(s)//十进制转8进制c=hex(s)//十进制转16进制其他进制转成10进制:s:转换的字符串r:要转换的进制位数2,6,18int(s,r)…

  • eigen库使用_eigen3

    eigen库使用_eigen3Eigen库的安装1.VisualStudio2017安装eigen库1.1下载eigen库1.2配置1.3运行测试1.VisualStudio2017安装eigen库1.1下载eigen库eigen官网下载地址找到自己需要的版本下载,我下载的是3.3.9,箭头指向的zip。解压缩得到文件eigen-3.3.9,放到自己想放置的路径下(后面会引用此处的路径)。1.2配置在VS2017中新建一个空项目,取名为“eigen_demo”。输入以下测试

    2022年10月19日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号