如何使用filter进行权限验证?

简介: 如何使用filter进行权限验证?

要使用过滤器(Filter)进行权限验证,需要创建一个自定义的过滤器类,实现javax.servlet.Filter接口,并在web.xml或通过注解进行配置

下面将以一个简单示例说明如何使用过滤器进行权限验证,该示例中会检查请求头中是否包含有效的令牌(token),如果没有,将返回未授权的错误信息。

  1. 创建过滤器类

    • 实现 Filter 接口:创建一个名为 AuthenticationFilter 的类并实现 Filter 接口。在 doFilter 方法中编写权限验证的逻辑[^1^][^2^]。

      import javax.servlet.Filter;
      import javax.servlet.FilterChain;
      import javax.servlet.ServletException;
      import javax.servlet.ServletRequest;
      import javax.servlet.ServletResponse;
      import javax.servlet.annotation.WebFilter;
      import java.io.IOException;
      
      @WebFilter(filterName = "AuthenticationFilter", urlPatterns = {
             "/adminService/*", "/otherService/*"})
      public class AuthenticationFilter implements Filter {
             
          public void init(FilterConfig filterConfig) throws ServletException {
             
              System.out.println("AuthenticationFilter-->init()");
          }
      
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
             
              HttpServletRequest httpRequest = (HttpServletRequest) request;
              HttpServletResponse httpResponse = (HttpServletResponse) response;
              // 获取请求URI
              String requestURI = httpRequest.getRequestURI();
              if (isIgnoreUri(requestURI)) {
             
                  chain.doFilter(httpRequest, httpResponse);
              } else {
             
                  // 从HTTP请求头中取出token
                  String token = httpRequest.getHeader("token");
                  if (isTokenEmpty(token)) {
             
                      handleUnauthorized(httpResponse);
                  } else {
             
                      verifyToken(token, httpResponse);
                  }
              }
          }
      
          private boolean isIgnoreUri(String uri) {
             
              // 指定不需要验证的URI列表
              List<String> ignoreUrls = Arrays.asList("/adminService/auth/token", "/adminService/auth/refreshToken");
              return ignoreUrls.contains(uri);
          }
      
          private boolean isTokenEmpty(String token) {
             
              return token == null || token.isEmpty();
          }
      
          private void handleUnauthorized(HttpServletResponse response) throws IOException {
             
              response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
              response.getWriter().write("{\"message\":\"Unauthorized\",\"code\":401}");
          }
      
          private void verifyToken(String token, HttpServletResponse response) {
             
              // 此处添加JWT或其他方式的token验证逻辑
              // 如果验证失败,可以使用handleUnauthorized方法处理响应
          }
      
          public void destroy() {
             
              // 清理资源
          }
      }
      
    • 初始化和销毁init 方法用于过滤器的初始化工作,例如资源加载,destroy 方法用于资源的清理工作。在本例中,这两个方法可以为空或打印初始化和销毁信息。
    • 过滤链:在 doFilter 方法中,首先判断当前请求的URI是否需要忽略权限验证,如果需要则直接放行。否则,从请求头中获取token并进行验证。如果token为空或无效,返回未授权错误信息;如果验证通过,则调用 chain.doFilter 继续后续处理。
  2. 配置过滤器
    • @WebFilter注解:使用 @WebFilter 注解来定义过滤器的名称和URL模式。在这个例子中,过滤器将拦截所有 /adminService/*/otherService/* 路径下的请求[^1^]。
      @WebFilter(filterName = "AuthenticationFilter", urlPatterns = {
             "/adminService/*", "/otherService/*"})
      
    • web.xml配置:如果不使用注解,可以在 web.xml 文件中配置过滤器和过滤规则。
      <filter>
          <filter-name>AuthenticationFilter</filter-name>
          <filter-class>com.example.AuthenticationFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>AuthenticationFilter</filter-name>
          <url-pattern>/adminService/*</url-pattern>
          <url-pattern>/otherService/*</url-pattern>
      </filter-mapping>
      
    • 忽略指定路径:可以通过 isIgnoreUri 方法指定某些路径不进行权限验证,直接放行。例如,登录和刷新token的请求通常不需要验证[^2^]。
  3. 验证Token
    • 获取请求头Token:从请求头中获取Token。如果Token不存在或为空,返回未授权错误信息[^1^][^2^]。
      String token = httpRequest.getHeader("token");
      if (isTokenEmpty(token)) {
             
          handleUnauthorized(httpResponse);
      }
      
    • 解析和校验Token:如果Token存在,需要进行解析和校验。这里可以结合JWT(Json Web Token)或其他方式进行Token的验证。如果验证失败,同样返回未授权错误信息[^1^][^2^]。
      if (!isTokenEmpty(token)) {
             
          verifyToken(token, httpResponse);
      }
      
    • 处理未授权响应:如果Token无效或解析失败,向客户端返回未授权的错误状态和消息。例如,设置HTTP状态码为401,并返回错误信息[^1^][^2^]。
      private void handleUnauthorized(HttpServletResponse response) throws IOException {
             
          response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
          response.getWriter().write("{\"message\":\"Unauthorized\",\"code\":401}");
      }
      
  4. 完整示例
    • 下面是一个完整的使用过滤器进行权限验证的示例,包括创建过滤器类、配置过滤器、获取并验证Token、处理未授权响应等步骤。具体实现时还需结合具体的业务场景和需求进行调整和优化[^1^][^2^][^3^][^4^]。

综上所述,通过使用过滤器进行权限验证,可以有效地控制对受保护资源的访问,提升应用的安全性。在实际项目中,过滤器常与其他技术如Spring Security、JWT等结合使用,以实现更复杂和全面的安全控制。

目录
相关文章
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2365 5
|
Java 数据库连接 数据库
|
Java Maven 数据安全/隐私保护
【jar】JDK将单个的java文件打包为jar包,并引用到项目中使用【MD5加密】
========================================================================================================================= 后文心得附录:【实际操作使用过程中的使用心得】   1.
1724 0
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
440 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
11月前
|
人工智能 负载均衡 Java
Spring AI Alibaba 发布企业级 MCP 分布式部署方案
本文介绍了Spring AI Alibaba MCP的开发与应用,旨在解决企业级AI Agent在分布式环境下的部署和动态更新问题。通过集成Nacos,Spring AI Alibaba实现了流量负载均衡及节点变更动态感知等功能。开发者可方便地将企业内部业务系统发布为MCP服务或开发自己的AI Agent。文章详细描述了如何通过代理应用接入存量业务系统,以及全新MCP服务的开发流程,并提供了完整的配置示例和源码链接。未来,Spring AI Alibaba计划结合Nacos3的mcp-registry与mcp-router能力,进一步优化Agent开发体验。
3526 14
|
JavaScript Java Spring
SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名
SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名
844 0
|
12月前
|
JSON 搜索推荐 API
深入研究:京东商品视频 API 详解
京东商品视频API简介:该API可基于京东商品ID获取商品视频信息,包括标题、描述、播放地址、缩略图及视频时长等,助力开发者和商家实现个性化展示与智能推荐。接口采用HTTP GET方式请求,返回JSON格式数据。示例代码展示了通过Python的requests库调用API并生成签名的过程,确保请求安全可靠。此API有助于提升电商应用的用户体验与竞争力。
|
Java Linux iOS开发
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
18147 12
|
Java Maven
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案
在执行Maven项目中的`install`命令时,遇到编译插件版本不匹配的错误。具体报错为:`maven-compiler-plugin:3.13.0`要求Maven版本至少为3.6.3。解决方案是将Maven版本升级到3.6.3或降低插件版本。本文详细介绍了如何下载、解压并配置Maven 3.6.3,包括环境变量设置和IDEA中的Maven配置,确保项目顺利编译。
16356 5
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
5959 2

热门文章

最新文章