使用Java Servlet过滤器实现简单的权限验证

118 阅读2分钟

在现代Web应用开发中,权限验证是保证应用程序安全的重要环节之一。特别是在涉及敏感操作的服务端点上,确保只有经过认证的用户才能访问这些资源至关重要。本文将介绍如何使用Java Servlet过滤器(Filter)来实现一个简单的权限验证机制,以确保只有携带有效令牌(token)的请求才能访问特定的服务。

创建过滤器类

首先,我们需要创建一个实现了javax.servlet.Filter接口的类。在这个类中,我们将实现doFilter方法,用于执行权限验证的逻辑。此外,我们还需要实现initdestroy方法,分别用于过滤器的初始化和销毁。

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class AuthenticationFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("AuthenticationFilter-->init()");
    }

    @Override
    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) {
        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方法处理响应
    }

    @Override
    public void destroy() {
        // 清理资源
    }
}

配置过滤器

接下来,我们需要在应用中配置这个过滤器。有两种方式可以配置过滤器:一种是在web.xml文件中配置,另一种是使用@WebFilter注解来声明过滤器及其应用范围。

import javax.servlet.annotation.WebFilter;

@WebFilter(filterName = "AuthenticationFilter", urlPatterns = {"/adminService/*", "/otherService/*"})
public class AuthenticationFilter implements Filter {
    // 类实现...
}

或者在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>

忽略指定路径

对于像登录和刷新token这样的请求,我们希望它们能够绕过权限验证直接访问。因此,我们需要在过滤器中实现一个方法来识别这些路径。

private boolean isIgnoreUri(String uri) {
    List<String> ignoreUrls = Arrays.asList("/adminService/auth/token", "/adminService/auth/refreshToken");
    return ignoreUrls.contains(uri);
}

验证Token

最后,我们需要实现一个方法来验证传递过来的Token。这通常涉及到解析Token以及验证其有效性和合法性。如果Token无效,则应调用handleUnauthorized方法。

private void verifyToken(String token, HttpServletResponse response) {
    // 实现Token验证逻辑
    // 如果验证失败,调用handleUnauthorized(response);
}

总结

通过上述步骤,我们可以构建出一个基本的权限验证框架,它能够在接收到请求时检查Token的有效性。这只是一个基础版本,实际应用中可能还需要考虑更多的安全措施,比如使用HTTPS加密传输、使用更复杂的Token生成和验证算法等。此外,还可以结合其他框架如Spring Security来增强安全性。