项目Javaweb…网络

Servlet:第六篇【过滤器基本介绍】

2018-05-22  本文已影响34人  __y

1.过滤器的基本概念

过滤器(Filter),是Servlet技术的一种应用,使用过滤器可以拦截用户的请求,对用户的请求按一定的规则进行处理(符合则放行)。通过对请求的过滤可以实现用户权限访问控制,编码设置,过滤敏感词汇等操作。

2.工作的原理

image.png

解析:
web浏览器先服务器请求资源的时候再调用service方法之前会调用filter中的doFilter方法,通过doFilter方法中的规则后,可以访问web资源;否则web资源不能被访问

3.生命周期

过滤器的生命周期为:初始化,doFilter,销毁。

4.过滤器的实现步骤:

第一种方式

标签解释:


映射:
在web.xml文件中注册了Filter之后,还要在web.xml文件中映射Filter

<!--映射过滤器-->
  <filter-mapping>
      <filter-name>FilterTest</filter-name>
      <!--“/*”表示拦截所有的请求 -->
      <url-pattern>/*</url-pattern>
  </filter-mapping>

<filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

第二种方式

通过注解的方式:
@WebFilter(filterName = "?", urlPatterns = "/*");

5.过滤链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

6.应用举例

登录案例

1.编写serlvetDemo类(service)

package servlet;


import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    public void init() throws ServletException {
        System.out.println("------初始化servlet-----");
        super.init();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得页面传过来的参数值
        String name = req.getParameter("username");
        String password = req.getParameter("password")  ;
        HttpSession session = req.getSession();
        session.setAttribute("username",name);
        //判断是否相等
        if(name.equals("admin") && password.equals("admin")) {
            System.out.println(name + " " +password);
            //重定向到别的页面
            resp.sendRedirect(req.getContextPath() + "/success.jsp");
        } else {
            resp.sendRedirect(req.getContextPath()+"/fail.jsp");
        }

    }
}

2.编写过滤器

package filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class FirstFilter implements Filter {
    private FilterConfig config;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        config  = filterConfig;
        System.out.println("-----------初始化---------");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("start----doFilter--FirstFilter");
        HttpServletRequest  request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //获得初始化的参数
        String noLoginPaths = config.getInitParameter("noLoginPaths");
        //规范编码格式
        String charset = config.getInitParameter("charset");
        if(charset == null){
            charset = "UTF-8";
        }
        request.setCharacterEncoding(charset);
        HttpSession session = request.getSession();
   
        //放行
        if(noLoginPaths!=null){
            String[] strArray = noLoginPaths.split(";");
            for (int i = 0; i < strArray.length; i++) {

                if(strArray[i]==null || "".equals(strArray[i]))continue;

                if(request.getRequestURI().indexOf(strArray[i])!=-1 ){
                    //进去下个过滤器或者直接进入servcie
                    filterChain.doFilter(servletRequest, servletResponse);
                    return;
                }
            }

        }


        if(session.getAttribute("username") != null) {
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            response.sendRedirect("index.jsp");
        }

        System.out.println("end------doFilter--FirstFilter");

    }

    @Override
    public void destroy() {
        System.out.println("destroy---FirstFilter");
    }
}

3.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>ServletDemo</servlet-name>
        <servlet-class>servlet.ServletDemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletDemo</servlet-name>
        <url-pattern>/servlet/ServletDemo</url-pattern>
    </servlet-mapping>


    <filter>
        <filter-name>FirstFilter</filter-name>
        <filter-class>filter.FirstFilter</filter-class>
        <init-param>
                <param-name>noLoginPaths</param-name>
                <param-value>index.jsp;fail.jsp;ServletDemo</param-value>
        </init-param>
        <init-param>
                <param-name>charset</param-name>
                <param-value>UTF-8</param-value>
        </init-param>

    </filter>
    <filter-mapping>
        <filter-name>FirstFilter</filter-name>
        <url-pattern>/*</url-pattern>
        
    </filter-mapping>
</web-app>
上一篇 下一篇

猜你喜欢

热点阅读