JSP Web过滤器入门1

1、定义

过滤器是Web程序中的可重用组件,是一个程序。它先于与之相关的Servlet或JSP页面运行在服务器上过滤器可以附加到一个或多个Servlet或JSP页面上,并且可以检查进入这些资源的请求信息。Filter接口是过滤器API的核心,所有的过滤器都必须直接或间接地实现该接口。可以在客户和资源之间建立多个过滤器,从而形成过滤器链(Filter Chain)。

2、处理方式

过滤器是客户端与目标资源间的中间层组件,属于Web容器的一部分,用于拦截客户端的请求与响应信息。

处理步骤如下:

①当Web容器接收一个客户端请求时,Web容器判断此请求是否与过滤器对象相关联,如果相关联,容器将这一请求交给过滤器进行处理。

②在处理过程中,过滤器可以对请求进行操作,如更改请求中的信息数据,在过滤器处理完成之后,再将这一请求交给其他业务进行处理。

③当所有业务处理完成,需要对客户端进行响应时,容器又将响应交给过滤器处理,过滤器处理响应完成后将响应发送到客户端。

注意:在Web程序的应用过程中可以放置多个过滤器,Web容器对多个过滤器的处理方式为链式处理,即容器首先将客户端请求交给第一个过滤器处理,处理完成之后交给下一个过滤器处理,以此类推,直到最后一个过滤器对象。

3、生命周期

过滤器类实现的Filter接口声明了三个方法,分别是init()、doFilter()、destory()方法,它们是过滤器的生命周期方法。

4、应用

①当身份不同的用户访问同一个页面时进行过滤,例如:管理员页面只能管理员账户才能进入

1)Web应用程序目录

2)登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<%--  这里的action使用的是相对路径,代表进入该路径--%>
    <form action="Login" method="post">
      用户:<input type="text" name="username">
      密码:<input type="password" name="userpwd">
      <input type="submit" value="登录">
    </form>
  </body>
</html>

3)处理登录请求的Servlet类

public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        HttpSession session = request.getSession();
        session.setAttribute("username",username);

        // 对不同的用户执行不同的重定向操作
        if (username.equals("admin")) {
//            这里使用的是相对路径,代表进入该路径
            response.sendRedirect("admin/admin_page.jsp");
        }
        else if(username.equals("user")) {
//            这里使用的是相对路径,代表进入该路径
            response.sendRedirect("user/user_page.jsp");
        }
    }
}

4)在Web.xml中对该Servlet进行配置

<servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>cn.qi.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/Login</url-pattern>
    </servlet-mapping>

5)用户页面和管理员页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户页面</title>
</head>
<body>
    你好:<%=(String)(session.getAttribute("username"))%><br />
<%--    超链接要使用绝对路径(包含项目路径)--%>
    <a href="/Filter_test_war_exploded/admin/admin_page.jsp">查看管理员界面</a>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>管理员页面</title>
</head>
<body>
    你好:<%=(String)(session.getAttribute("username"))%><br />
    <%--    超链接要使用绝对路径--%>
    <a href="/Filter_test_war_exploded/user/user_page.jsp">查看用户页面</a>
</body>
</html>

6)过滤器(实现Filter接口即可)

public class LoginFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//        处理HTTP请求和响应时需要将ServletRequest强制类型转换为HttpServletRequest
        String username = (String) ((HttpServletRequest)req).getSession().getAttribute("username");
        String requestURI = ((HttpServletRequest)req).getRequestURI();
        HttpServletResponse res = (HttpServletResponse)resp;

        if (username != null && username.equals("user") && requestURI.startsWith("/Filter_test_war_exploded/admin")) {
//            页面重定向时使用相对路径
            res.sendRedirect("../access_denied.jsp");
        }
        else if (username != null && username.equals("admin") && requestURI.startsWith("/Filter_test_war_exploded/user")) {
            res.sendRedirect("../access_denied.jsp");
        }

        // 请求转到下一资源或下一过滤器
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
    }
}

 7)在Web.xml对该过滤器进行配置

<filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>cn.qi.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
<!--        这里使用的是相对路径-->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
<!--        这里使用的是相对路径-->
        <url-pattern>/user/*</url-pattern>
    </filter-mapping>
原文地址:https://www.cnblogs.com/GjqDream/p/11728051.html