UserFilter.java 代码
package filter; import java.io.IOException; 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.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; /** * 用于检查用户是否登录了系统的过滤器<br> * 创建日期:2012-04-24 * */ public class UserFilter implements Filter { /** 要检查的 session 的名称 */ private String sessionKey; /** 需要排除(不拦截)的URL的字符串 */ private String excepUrl; /** 检查不通过时,转发的URL */ private String redirectUrl; public void init(FilterConfig cfg) throws ServletException { sessionKey = cfg.getInitParameter("sessionKey"); redirectUrl = cfg.getInitParameter("redirectUrl"); excepUrl = cfg.getInitParameter("excepUrl"); } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 如果 sessionKey 为空,则直接放行 if (StringUtils.isBlank(sessionKey)) { chain.doFilter(req, res); return; } // * 请求 http://127.0.0.1:8080/webApp/home.jsp?&a=1&b=2 时 // * request.getRequestURL(): http://127.0.0.1:8080/webApp/home.jsp // * request.getContextPath(): /webApp // * request.getServletPath():/home.jsp // * request.getRequestURI(): /webApp/home.jsp // * request.getQueryString():a=1&b=2 HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String servletPath = request.getServletPath();//当前页面的路径(如"/index.jsp") // 如果请求的路径与redirectUrl(将要跳转的页面)相同,或请求的路径是排除的URL时,则直接放行 if (servletPath.equals("/"+redirectUrl) || excepUrl.contains(servletPath)) { chain.doFilter(req, res); return; } Object sessionObj = request.getSession().getAttribute(sessionKey); // 如果Session为空,则跳转到指定页面 if (sessionObj == null) { response.sendRedirect(redirectUrl); } else { chain.doFilter(req, res); } } public void destroy() { } }
web.xml 代码
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>UserFilter</filter-name> <filter-class>filter.UserFilter</filter-class> <init-param> <description> 将当前登录的用户的信息保存在 session 中时使用的key, 如果没有配置此参数,则该过滤器不起作用 </description> <param-name>sessionKey</param-name> <param-value>userInfo</param-value> </init-param> <init-param> <description> 如果用户未登录(即在 session 中 key 为 sessionKey 的属性不存在或为空), 则将请求重定向到该 url。该 url 不包含web应用的 ContextPath。 如果不配置此参数,则在用户未登录系统的情况下,直接重定向到web应用的根路径(/) </description> <param-name>redirectUrl</param-name> <param-value>index.jsp</param-value> </init-param> <init-param> <description> 不需要进行拦截的 url,即:如果当前请求的 url 的 servletPath 能在此excepUrl里,则直接放行(即使未登录系统)。 格式如(/checkuser.jsp /up.jsp) </description> <param-name>excepUrl</param-name> <param-value>/checkuser.jsp</param-value> </init-param> </filter> <filter-mapping> <filter-name>UserFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <login-config> <auth-method>BASIC</auth-method> </login-config> </web-app>