关闭

Java Web开发----过滤器

标签: java web过滤器
158人阅读 评论(0) 收藏 举报
分类:

过滤器是一个服务端的组件,它可以截取用户端的请求与响应信息,并对这些信息过滤,过滤器的功能可以理解为对原有的服务代码进行增强达到校验,过滤等的效果,与拦截器很相似,博主私以为过滤器有点像AOP


一 工作原理

这里写图片描述


二 生命周期

这里写图片描述

  • 实例化是在Web容器启动时完成的,Web.xml配置形式如下:
<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>filter.LoginFilter</filter-class>
    <init-param>
        <param-name>noFilterPath</param-name>
        <param-value>login.jsp;fail.jsp;LoginServlet</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 初始化时可以通过init方法中的FilterConfig参数获得Web.xml文件中的配置信息
  • doFilter为过滤方法,在执行完过滤操作,需要放行(chain.doFilter(request, response);)或者拦截(可以是跳转到其他页面)

三 过滤器链

多个过滤器同时对某个请求访问进行过滤时,按照在Web.xml中定义的顺序来依次执行
这里写图片描述


四 过滤器分类

Servlet2 包括REQUEST,FORWARD,INCLUDE,ERROR
Servlet3 还有一个ASYNC
这里写图片描述


五 过滤器注解实现

除了在web.xml配置Filter外,还可以通过注解@WebFilter的方式实现,@WebFilter将一个类声明为过滤器,该注解会在部署时被容器处理,容器将根据具体的属性将相应的类部署为过滤器。


六 案例

案例1:登陆校验

public void doFilter(ServletRequest request0, ServletResponse response0, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here
        HttpServletRequest request = (HttpServletRequest) request0;
        HttpServletResponse response = (HttpServletResponse) response0;
        HttpSession session = request.getSession();

        /*
         * 是以下方法的简单版
         */
        String noFilterPath = config.getInitParameter("noFilterPath");
        if(noFilterPath != null) {
            String[] paths = noFilterPath.split(",");
            for(String s : paths) {

                if(s == null || "".equals(s)) continue;
                if(request.getRequestURI().indexOf(s) != -1) {
                    chain.doFilter(request, response0);
                    return;
                }
            }
        }


        /*
         * 解决<url-pattern>/*</url-pattern>的重定向循环问题
         * 解决servlet被过滤
         */
        if(request.getRequestURI().indexOf("login.jsp") != -1 
                || request.getRequestURI().indexOf("LoginServlet") != -1) {
            chain.doFilter(request, response);
            return;
        }



        if(session.getAttribute("username") != null)
            chain.doFilter(request, response);
        else
            response.sendRedirect("login.jsp");

案例2:字符集校验

在Filter中添加一下代码即可

request.setCharacterEncoding("UTF-8");

但是在浏览器输入中文时,Eclipse控制台输出“& # 24352;& #19977;”这种Unicode,并没有转换为字符串,不知道什么原因?各位客官如果知道,还请不吝赐教,谢谢!

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场