Java过滤器的使用和拦截排除的实现
本文将对如下几个内容作出讲解与说明:
web.xml的简单介绍
filter的工作原理
filter的实现
拦截排除的实现和说明
web.xml简单介绍
在Java开发中,我们每天都有跟拦截器打交道,但是很多人对filter到底是个什么东西可能并没有做深入的了解,包括对web.xml中的servlet、servlet-Mapping、filter、filter-mapping都很陌生,那么现在我们可以简单的交流一下。
- servlet
<servlet>
<servlet-name>A</servlet-name>
<servlet-class>com.test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>A</servlet-name>
<url-pattern>/a.do</url-pattern>
</servlet-mapping>
servlet上表达的意思就是声明一个名字A的servlet,对应的实现类com.test.TestServlet。servlet-mapping表达的意思是,当一个请求后缀为a.do的http请求发送过来以后,该请求会调用名字为A的servlet,换句话说就是执行TestServlet来处理该请求。
- filter
有了上面servlet的理解,我们理解filter就更加方便。请看如下简单配置。
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>
com.demo.test.util.SessionFilter
</filter-class>
<init-param>
<param-name>excludedPages</param-name>
<param-value>/index.jsp</param-value><!-- 匹配不做拦截的请求声明-->
</init-param>
</filter>
<filter-mapping><!-- 拦截的请求类型-->
<filter-name>SessionFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
上面的filter表达的意思是声明一个名字叫做SessionFilter的过滤器,该过滤器的具体实现对应com.demo.test.util.SessionFilter。该过滤器给定初始化参数(名称:excludedPages,参数:excludedPages),类似httpServletRequest对象中的声明的请求参数。filter-mapping表示当系统中发起有访问index.jsp的http请求的时候则调用该拦截器,也就是执行com.demo.test.util.SessionFilter。如果想要深入的了解filter工作原理,可以自己搜索资料,资料也很多。
filter具体class实现
public class SessionFilter implements Filter {
private String excludedPages;
private String[] excludedPageArray;
/**
* @see Filter#destroy()
*/
public void destroy() {
return;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
boolean isExcludedPage = false;
for (String page : excludedPageArray) {
if (((HttpServletRequest) request).getServletPath().equals(page)) {
isExcludedPage = true;
break;
}
}
if (isExcludedPage) {
chain.doFilter(request, response);
} else {//
HttpSession session = ((HttpServletRequest) request).getSession();
if (session == null || session.getAttribute("") == null) {
((HttpServletResponse) response).sendRedirect("/login.htm");
} else {
chain.doFilter(request, response);
}
}
}
public void init(FilterConfig fConfig) throws ServletException {
excludedPages = fConfig.getInitParameter("excludedPages");
if (null != excludedPages && excludedPages.length() > 0) {
excludedPageArray = excludedPages.split(",");
}
return;
}
}
当执行该拦截器会先执行init方法,我们在init方法中可以获取到在web.xml中配置给filter的初始化参数。在执行init方法执行,则执行dofilter方法,在该方法中我们实现过滤器的拦截作用,并实现拦截排除。
拦截器工作原理 如何实现拦截:
当一个http请求到达之后,并符合web.xml中的filter-mapping的映射规则,则触发执行filter,如果不做拦截,则调用chain.doFilter(request, response)让系统继续执行,如需要做拦截,则跳转到制定的页面,例上面的demo,则跳转到login.html页面。
排除拦截实现 如何对某个请求不做拦截:
当一个请求到达之后,我们在init中获取了web.xml中给filter配置的初始化参数,获取到该初始化数据就是我们不做拦截的请求的规则,本例子中是使用index.jsp作为拦截排除请求。也是使用index.jsp作为过滤器触发映射条件。也就是当系统中有http请求以index.jsp结尾,则该请求触发执行SessionFilter,在SessionFilter中我们获取到排除拦截的参数是index.jsp。在if (((HttpServletRequest) request).getServletPath().equals(page)) {
代码中 就是处理当前的请求是否是请求index.jsp,如果是我们则不作拦截,如果不是我们则跳转到login.html页面。这样通过给filter制定初始化参数,并且在filter中将当前的request与初始化参数对比,来判断是否拦截本次请求的要求就达到了。
如果在阅读中遇到问题可以自己搜索资料了解web.xml在Javaweb项目中的作用于详细讲解。