权限过滤器(filter)

本文深入解析了Filter在Web应用中的执行原理,特别是如何通过Filter实现URL级别的权限控制,确保只有认证用户能访问特定资源,同时提供了详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,会发现跳转到登录页面

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值