Java过滤器的使用和拦截排除的实现

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项目中的作用于详细讲解。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页