filter的执行原理
一个数组与一个map
一个map:map的key为 url-pattern 的值,value为filter实例对象的引用
一个数组:存放着与请求向匹配的所有Filter
执行原理:
当对某资源的请求到达Web容器时,会先对请求进行解析,使用解析出的URl作为比较对象,从Map中查找是否存在相匹配的key。
若存在:那么读取其value,即Filter对象的引用,将该引用存入到数组中。然后继续向后查找,知道将该Map查找完毕。这样在数组中就会存在按照查找顺序排好序的Filter引用。
数组初始化完毕后,开始按照数组元素顺序进行执行,所有数组中的Filter全部执行完毕后,在跳转到请求目标资源。

利用filter去判断url的地址是否是该用户可以访问的
是,即可访问
不是,即跳转到登录页面

package com._12_permissionFilter.filters;

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

@WebFilter("/*")
public class ParmissionFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) servletRequest;
        String servletPath = req.getServletPath();
        //若servletPath以/user开头,那么。这个请求的资源必须要登录才可以访问
        if(servletPath.startsWith("/user")){
            HttpSession session = req.getSession(false);
            //若session不为null,则需要判断user
            //若session为null,则一定没有登录,那么跳转到登录页面
            if(session != null){
                String user = (String) session.getAttribute("user");
                //若user为null,则说明没有登录,那么跳转到登录页面
                //若user不为null,则说明已经登录,则放行
                if(user != null){
                    filterChain.doFilter(servletRequest,servletResponse);
                } else {
                    req.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
                    return;
                }
            }else {
                req.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
                return;
            }
        } else {
            //若servletPath不以/user开头,那么访问的资源不需要登录即可访问
            filterChain.doFilter(servletRequest,servletResponse);
        }

    }
}

package com._12_permissionFilter.servlets;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user = req.getParameter("username");
        req.getSession().setAttribute("user",user);

        resp.getWriter().print(user + " login success");
    }
}

package com._12_permissionFilter.servlets;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/someServlet")
public class SomeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.setContentType("text/html;charset=utf-8");

        resp.getWriter().print("SomeServlet, 需要登录后才可访问");
    }
}

首页页面 index.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  无需要登录,可访问
  </body>
</html>

登录页面 login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/loginServlet" method="post">

    用户名:<input type="text" name="username" />
    <input type="submit" value="登录" />

</form>
</body>
</html>

登出页面 user/logout.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
session.invalidate();
%>
    需要登录后才能访问
</body>
</html>

用户浏览页面 user/userList.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    用户浏览页面
</body>
</html>

先进入登录页面,然后去user/userLsit.jsp页面浏览,再登出 user/logout.jsp,再次进入user/userLsit.jsp,会发现跳转到登录页面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐