实现方式:在Action中清除了缓存

jsp:

<c:if test="${!empty sessionScope.user}">
     <li><a href="#">欢迎:${sessionScope.user.username}</a></li>
     <li><a href="${pageContext.request.contextPath}/user/exit"target="_parent">退出系统</a></li>
</c:if

UserAction:

public String exit(){
        HttpSession session = ServletActionContext.getRequest().getSession();
        session.setAttribute("user",null);
        return "exitOk";
    }

struts.xml:

<action name="exit" class="com.tjcu.action.UserAction" method="exit">
    <result name="exitOk" type="redirect">/login.jsp</result>
</action>

这样做虽然清空了session,返回了登录页面,但是如果点击了浏览器的后退按钮又回到了之前的页面,这是因为浏览器的后退使用了本地缓存,改进后的:

新建一个NoCacheFilter类:

package com.tjcu.filter;

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

public class noCacheFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse hsr = (HttpServletResponse) res;
        hsr.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        hsr.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        Expiree 实体报头域给响应过期的日期和时间  HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期
        hsr.setDateHeader("Expires", 0); // Proxies.
        chain.doFilter(req, res);
    }

    @Override
    public void destroy() {

    }
}

web.xml:

<filter>
    <filter-name>noCacheFilter</filter-name>
    <filter-class>com.bz.filter.noCacheFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>noCacheFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>

*.jsp表示对任意的jsp页面都使用noCacheFilter进行过滤,可以根据实际情况改变

Http消息报头包括普通报头、请求报头、响应报头、实体报头

普通报头中的Cache-Control用于指定缓存指令,缓存指令是单向的、独立的

响应中的缓存指令请求中不一定存在,一个消息的缓存指令不会影响另一个消息处理的缓存机制

请求时的缓存指令:no-cache/no-store/max-age/max-state/min-fresh/only-if-cached

响应时的缓存指令:public/private/no-cache/no-store/no-transform/must-revalidate/proxy-revalidate/max-age/s-maxage

各个消息中的指令含义如下:

public 指示响应可被任何缓存区缓存
private 指示对于单个用于的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述用户的部分响应消息,此响应消息对于其他用户的请求无效
no-cache 指示请求或响应请求或响应消息不能缓存
no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存

expires是response的一个属性可以设置页面在浏览器的缓存里保存的时间

超过设定的时间后就过期,过期后再次浏览该页面就需要重新请求服务区发送页面数据

如果在规定的时间内再次访问此页面,直接从缓存中读取

* 前端验证码的请求中可以带入时间数 每次点击都会认为是新的一次请求

<!-- 验证码 -->
<img class="code" src="code" onclick="this.src='code?d=' + new Date()">