从J2EE1.3开始,Servlet2.3规范中加入了对过滤器的支持,过滤器能够对目标资源的请求和相应进行截取。过滤器的工作方式分为4种:request过滤器,include过滤器,forward过滤器,error过滤器。
过滤器的工作分为等我弄懂了再说。我们先说说Java如何处理filter请求
public class AuthorityFilter implements Filter {//FilterConfig可用于访问Filter的配置信息private FilterConfig config;//实现初始化方法public void init(FilterConfig config){this.config = config; }//实现销毁方法public void destroy(){this.config = null; }//执行过滤的核心方法public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException,ServletException{//获取该Filter的配置参数String encoding = config.getInitParameter("encoding");String loginPage = config.getInitParameter("loginPage");String proLogin = config.getInitParameter("proLogin");//设置request编码用的字符集request.setCharacterEncoding(encoding); //①HttpServletRequest requ = (HttpServletRequest)request;HttpSession session = requ.getSession(true);//获取客户请求的页面String requestPath = requ.getServletPath();//如果session范围的user为null,即表明没有登录//且用户请求的既不是登录页面,也不是处理登录的页面if( session.getAttribute("user") == null&& !requestPath.endsWith(loginPage)&& !requestPath.endsWith(proLogin)){//forward到登录页面request.setAttribute("tip" , "您还没有登录");request.getRequestDispatcher(loginPage).forward(request, response);}//“放行”请求else{chain.doFilter(request, response);}}}
上面Filter的doFilter方法里前三行代码用于获取Filter的配置参数。①号代码按配置参数设置了request编码所用的字符集。接下来判断session范围内是否有user属性,没有该属性即认为没有登录,如果既没有登录,而且请求地址也不是登录页面和处理登录页面,那么系统直接跳转到登录页面。
该Filter在web.xml中的配置片段如下:
<!-- 定义Filter -->上面的配置片段为Filter指定了3个配置参数,指定loginPage为/login.jsp,proLogin为/proLogin.jsp。这表明,如果没有登录该应用,普通用户只能访问login.jsp和proLogin.jsp页面,只有当用户登录之后才可以*访问其他页面。
<filter>
<!-- Filter的名字 -->
<filter-name>authority</filter-name>
<!-- Filter的实现类 -->
<filter-class>lee.AuthorityFilter</filter-class>
<!-- 下面3个init-param元素配置了3个参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>loginPage</param-name>
<param-value>/login.jsp</param-value>
</init-param>
<init-param>
<param-name>proLogin</param-name>
<param-value>/proLogin.jsp</param-value>
</init-param>
</filter>
<!-- 定义Filter拦截的URL地址 -->
<filter-mapping>
<!-- Filter的名字 -->
<filter-name>authority</filter-name>
<!-- Filter负责拦截的URL -->
<url-pattern>/*</url-pattern>
</filter-mapping>
在web.xml中配置Filter,只用init-param元素为该Filter配置参数,init-param可接收如下两个子元素:
param-name:指定参数名
param-value:指定参数值
另外,filter-class中指定的过滤器类需继承javax.servlet.Filter,并且必须有以下三种方法:
init(FilterConfig filterConfig):初始化,一般情况下读取配置文件中的init-param参数值,如filterConfig.getInitParameter("encoding")
doFilter(...):用于对request,response进行处理,并通过chain.doFilter(...)交给下一个控制器
destroy():资源销毁