实现方式:在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()">