在现代Web应用开发中,权限验证是保证应用程序安全的重要环节之一。特别是在涉及敏感操作的服务端点上,确保只有经过认证的用户才能访问这些资源至关重要。本文将介绍如何使用Java Servlet过滤器(Filter)来实现一个简单的权限验证机制,以确保只有携带有效令牌(token)的请求才能访问特定的服务。
创建过滤器类
首先,我们需要创建一个实现了javax.servlet.Filter接口的类。在这个类中,我们将实现doFilter方法,用于执行权限验证的逻辑。此外,我们还需要实现init和destroy方法,分别用于过滤器的初始化和销毁。
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来增强安全性。