Struts过滤器实践:防止缓存与用户登录检测

需积分: 9 1 下载量 24 浏览量 更新于2024-09-15 收藏 16KB DOCX 举报
"struts过滤器相关知识" 在Java Web开发中,Struts是一个非常流行的MVC框架,它帮助开发者构建可维护性和可扩展性良好的Web应用程序。过滤器(Filter)是Servlet API的一部分,用于处理HTTP请求和响应,在请求到达目标Servlet或JSP之前以及之后进行拦截和处理。在Struts框架中,过滤器可以用来增强应用程序的功能,例如防止页面缓存、检测用户登录状态等。以下将详细解释这两个实用的过滤器实例。 一、防止浏览器缓存页面的过滤器 这个过滤器通过设置特定的HTTP响应头来阻止浏览器缓存页面。当浏览器接收到这些头信息时,它会理解为该页面不应该被缓存,而是每次都应从服务器获取最新版本。以下是实现这个功能的过滤器代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ForceNoCacheFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Cache-Control", "no-cache"); httpResponse.setHeader("Pragma", "no-cache"); httpResponse.setDateHeader("Expires", -1); filterChain.doFilter(request, response); } public void destroy() { } public void init(FilterConfig filterConfig) throws ServletException { } } ``` 在这个过滤器中,`doFilter()`方法是核心,它首先将响应转换为`HttpServletResponse`类型,然后设置三个HTTP响应头: - `Cache-Control: no-cache`:指示浏览器不应缓存响应。 - `Pragma: no-cache`:这个HTTP/1.0的头部对于某些老版本的浏览器仍然有效。 - `Expires: -1`:设置过期时间为过去,确保浏览器总是认为页面已过期。 二、检测用户是否已登录的过滤器 这个过滤器的作用是在用户访问受保护的资源之前,检查其是否已经登录。如果没有登录,将重定向到指定的登录页面。下面是这个过滤器的示例代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.List; import java.util.ArrayList; import java.util.StringTokenizer; import java.io.IOException; public class CheckLoginFilter implements Filter { private String checkSessionKey; public void init(FilterConfig filterConfig) throws ServletException { checkSessionKey = filterConfig.getInitParameter("checkSessionKey"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpSession session = httpRequest.getSession(false); if (session == null || session.getAttribute(checkSessionKey) == null) { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.sendRedirect("/login.jsp"); // 将重定向到登录页面的URL替换为实际的URL } else { filterChain.doFilter(request, response); } public void destroy() { } } } ``` 在`CheckLoginFilter`中,`init()`方法用于初始化过滤器,从Web应用的部署描述符(web.xml)中获取检查的Session关键字。`doFilter()`方法检查当前请求的`HttpSession`是否存在,并且该关键字对应的值是否非空。如果用户未登录(即没有有效的Session或Session中缺少指定的键),则使用`HttpServletResponse.sendRedirect()`将请求重定向到登录页面。 这两个过滤器示例展示了如何利用Struts和其他Servlet技术来增强应用程序的安全性和用户体验。在实际项目中,可以根据需求定制过滤器,实现如权限控制、字符编码转换、GZIP压缩等多种功能。