要使用过滤器(Filter)进行权限验证,需要创建一个自定义的过滤器类,实现javax.servlet.Filter
接口,并在web.xml或通过注解进行配置。
下面将以一个简单示例说明如何使用过滤器进行权限验证,该示例中会检查请求头中是否包含有效的令牌(token),如果没有,将返回未授权的错误信息。
创建过滤器类
实现 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
继续后续处理。
- 配置过滤器
- @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^]。
- @WebFilter注解:使用
- 验证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}"); }
- 获取请求头Token:从请求头中获取Token。如果Token不存在或为空,返回未授权错误信息[^1^][^2^]。
- 完整示例
- 下面是一个完整的使用过滤器进行权限验证的示例,包括创建过滤器类、配置过滤器、获取并验证Token、处理未授权响应等步骤。具体实现时还需结合具体的业务场景和需求进行调整和优化[^1^][^2^][^3^][^4^]。
综上所述,通过使用过滤器进行权限验证,可以有效地控制对受保护资源的访问,提升应用的安全性。在实际项目中,过滤器常与其他技术如Spring Security、JWT等结合使用,以实现更复杂和全面的安全控制。