Java Filter 实例:防止缓存与用户登录检测

版权申诉
0 下载量 199 浏览量 更新于2024-09-06 收藏 42KB PDF 举报
"该PDF文件主要讲解了Java中Filter的使用方法,重点在于如何通过Filter进行数据过滤以及实现特定的功能,如防止浏览器缓存页面和检测用户是否已登录。" 在Java Web开发中,Filter(过滤器)是Servlet API的一部分,它允许开发者在请求到达目标Servlet或JSP之前对其进行拦截和处理,以及在响应返回给客户端之前进行修改。Filter可以用来实现多种功能,如数据校验、权限控制、日志记录等。以下是两个示例代码: 1. 防止浏览器缓存页面的Filter: ```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 { } } ``` 在这个例子中,Filter会在响应头中设置"Cache-Control"、"Pragma"和"Expires"字段,确保浏览器不会缓存页面。"no-cache"告诉浏览器不要缓存响应,设置"Expires"为-1表示过期时间是在过去,进一步强调不应缓存。 2. 检测用户是否登录的Filter: ```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 LoginCheckFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; HttpSession session = httpRequest.getSession(false); if (session == null || session.getAttribute("username") == null) { // 用户未登录,重定向到登录页面 httpResponse.sendRedirect("/login.jsp"); } else { // 用户已登录,继续执行请求链 filterChain.doFilter(request, response); } } public void destroy() { } public void init(FilterConfig filterConfig) throws ServletException { } } ``` 这个Filter检查每个请求的会话(session),如果会话不存在或者没有"username"属性,说明用户没有登录,Filter会将请求重定向到登录页面。反之,如果会话中有"username"属性,说明用户已登录,Filter会允许请求继续执行。 使用Filter时,需要在web.xml配置文件中声明Filter,并指定其拦截哪些URL模式: ```xml <filter> <filter-name>ForceNoCacheFilter</filter-name> <filter-class>com.example.ForceNoCacheFilter</filter-class> </filter> <filter-mapping> <filter-name>ForceNoCacheFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>LoginCheckFilter</filter-name> <filter-class>com.example.LoginCheckFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginCheckFilter</filter-name> <url-pattern>/protected/*</url-pattern> </filter-mapping> ``` 这样,所有以"/protected/"开头的URL都会被LoginCheckFilter拦截,而所有请求都将通过ForceNoCacheFilter,防止浏览器缓存页面。 通过合理使用Filter,开发者可以实现高效且灵活的Web应用程序,提升用户体验并增强安全性。在实际项目中,Filter通常与其他安全框架(如Spring Security)结合使用,提供更强大的功能和控制。
2023-07-09 上传

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer com.cz.JobWeb.controller.persController.ShowOneComInfo(persController.java:39) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:807) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) javax.servlet.http.HttpServlet.service(HttpServlet.java:515) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) javax.servlet.http.HttpServlet.service(HttpServlet.java:583) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:94) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)

2023-06-02 上传