如何使用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等结合使用,以实现更复杂和全面的安全控制。

目录
相关文章
ESP-01S连接OneNET上报温湿度信息
本文介绍了如何利用ESP-01S连接OneNET上报温湿度信息,其中包括如何烧录固件,如何配置OneNET平台,如何进行连接测试。最后,给出了一部分程序设计。
1497 0
ESP-01S连接OneNET上报温湿度信息
|
Java API p3c
【Java基础】@Transactional(rollbackFor=Exception.class)的使用
@Transactional(rollbackFor=Exception.class)的使用
1204 0
【Java基础】@Transactional(rollbackFor=Exception.class)的使用
|
存储
ASCII码可以表示汉字吗?
ASCII码可以表示汉字吗?
5652 0
|
8月前
|
Java 网络安全 开发工具
Java微服务项目集成Git云效详细教程
本文介绍了如何使用阿里云CodeUp进行代码管理,包括创建云效组织、初始化代码仓库、生成SSH密钥免密提交、将本地项目推送至云端、创建develop开发分支,并规范团队协作的工作流,实现基于Git的分支管理与Pull Request协同开发。
698 0
|
存储 关系型数据库 MySQL
成本直降30%!RDS MySQL存储自动分层实战:OSS冷热分离架构设计指南
在日均订单量超500万的场景下,MySQL数据年增200%,但访问集中在近7天(85%)。通过冷热数据分离,将历史数据迁移至OSS,实现存储成本下降48%,年省72万元。结合RDS、OSS与Redis构建分层架构,自动化管理数据生命周期,优化查询性能与资源利用率,支撑PB级数据扩展。
981 3
|
存储 人工智能 JSON
Evolving Agents:开源Agent革命!智能体动态进化框架上线,复杂任务一键协同搞定
Evolving Agents 是一个开源的AI Agent管理与进化框架,支持智能代理之间的通信与协作,能够根据语义理解需求动态进化,适用于文档处理、医疗保健、金融分析等多个领域。
879 26
Evolving Agents:开源Agent革命!智能体动态进化框架上线,复杂任务一键协同搞定
|
Kubernetes 安全 Devops
「迁移急救包」全云平台无缝迁移云效实操手册
阿里云云效是国内领先的一站式DevOps平台,提供代码全生命周期管理、智能化交付流水线及精细化研发管控,支持多种开发场景。本文详细介绍了从其他平台(如Coding)向云效迁移的完整方案,包括代码仓库、流水线、制品仓库及项目数据的迁移步骤,帮助用户实现高效、安全的平滑迁移,提升研发效率与协作能力。
1051 29
|
机器学习/深度学习 传感器 人工智能
2024.11|全球具身智能的端到端AI和具身Agent技术发展到哪里了
2024年,具身智能领域取得显著进展,特别是在端到端AI控制系统和多模态感知技术方面。这些技术不仅推动了学术研究的深入,也为科技公司在实际应用中带来了突破。文章详细介绍了端到端AI的演化、自监督学习的应用、多模态感知技术的突破、基于强化学习的策略优化、模拟环境与现实环境的迁移学习、长程任务规划与任务分解、人机协作与社会交互能力,以及伦理与安全问题。未来几年,具身智能将在多模态感知、自监督学习、任务规划和人机协作等方面继续取得重要突破。
1298 2
|
JSON 测试技术 API
Python开发解析Swagger文档小工具
文章介绍了如何使用Python开发一个解析Swagger文档的小工具,该工具可以生成符合httprunner测试框架的json/yaml测试用例,同时还能输出Excel文件,以方便测试人员根据不同需求使用。文章提供了详细的开发步骤、环境配置和使用示例,并鼓励读者为该开源项目贡献代码和建议。
909 1
Python开发解析Swagger文档小工具
|
存储 设计模式 网络协议
Netty网络框架(一)
Netty网络框架
1212 1