- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用过滤器检查登录用户的 URL 模式。
但是我有很多 URL 模式需要过滤。
{ "/table/*", "/user/*", "/contact/*", "/run/*", "/conf/*", ..., ..., ...}
它变得无法维护。只是排除会更简单:
{ "/", "/login", "/logout", "/register" }
我怎样才能做到这一点?
@WebFilter(urlPatterns = { "/table/*","/user/*", "/contact/*","/run/*","/conf/*"})
public class SessionTimeoutRedirect implements Filter {
protected final Logger logger = LoggerFactory.getLogger("SessionFilter");
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if (request.getSession().getAttribute("Id") != null) {
chain.doFilter(req, res);
} else {
logger.debug("session is null:"+request.getRequestURL());
response.sendRedirect(request.getContextPath()+"/login");
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
@Override
public void destroy() {
}
}
最佳答案
servlet API 不支持“排除”URL 模式。
你最好的选择是只映射到 /*
并比较 HttpServletRequest#getRequestURI()
针对一组允许的路径。
@WebFilter("/*")
public class LoginFilter implements Filter {
private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>(
Arrays.asList("", "/login", "/logout", "/register")));
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", "");
boolean loggedIn = (session != null && session.getAttribute("Id") != null);
boolean allowedPath = ALLOWED_PATHS.contains(path);
if (loggedIn || allowedPath) {
chain.doFilter(req, res);
}
else {
response.sendRedirect(request.getContextPath() + "/login");
}
}
// ...
}
关于java - @WebFilter 排除 url 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31318397/
我正在将基于 Servlet 2.5 的 webapp 迁移到 Servlet 3.0,遇到了这个问题,我不知道如何将这些不同的过滤器映射压缩到一个 @WebFilter 注释中类。 过滤器:
考虑我的 web.xml 中的以下过滤器映射 rememberMeCookieFilter /* mustBeSignedInFilter /private/*
如果是这样,你怎么做? 是的,这听起来像是我的最后一个问题。它本质上是相同的问题。我有一个 @javax.servlet.annotation.WebFilter直接打包到 war 中时效果很好。现在
我有一个使用 Spring Boot 2.0.0.M5/2.0.0.BUILD-SNAPSHOT 的 Spring Boot WebFlux 应用程序。我需要将跟踪 ID 添加到所有日志中。 为了让它
类可以用@WebFilter(urlPatterns="*")注释,但spring不会根据请求运行它。为什么?如果我向 Application 类添加 @ServletComponentScan 注释
我一直在研究受 balusC 的 answers 启发的代码。 。基本上它是一个网络过滤器,如果有记住我的cookie,它会尝试登录用户。 登录发生后,它首先从 userService-EJB 获取
我正在尝试将 WebFilter 与 JSF 2 结合使用,但我的过滤器无法正常工作。无法识别 urlPattern。 我的过滤器类: @WebFilter(urlPatterns = {"/rws/
虽然我似乎有它们的“精确”副本,但我已经阅读了很多示例,所以我无法弄清楚为什么当我导航到 /login 而不是 /时我的过滤器会执行限制/*。我已尝试使用注释(如下例所示)和 XML 来定义 WebF
我正在尝试在我的 Spring 应用程序中添加 WebFilter。但是,我没有使用 .xml 文件(甚至没有 web.xml,因为我的应用程序不需要它)。 因此,我添加到扩展 AbstractAnn
我想实现一个 WebFilter,它读取传入请求的特定 header ,使用此 header 的值向另一个响应式(Reactive) REST 端点调用 GET 请求,然后使用 GET 响应的值改变原
我在 urlrewrite.xml 中有以下配置: ^(/event/showEventList)(\.{1})(\bhtm\b|\bhtml\b)(\?{0,1})(
我想在 webfilter 配置 Spring 应用程序中使用通配符/{login}/cart/* 添加此路径的过滤器,但 {login} 的通配符不起作用 @Bean public FilterRe
我的代码中有一个具有以下设置的过滤器。我映射了值请求中的所有内容 @WebFilter(value="/*", dispatcherTypes={DispatcherType.REQUEST, Di
我正在使用 Google Admob,当我删除 testDevice 行时,我在控制台屏幕上看到日志下方。这是什么意思?有什么问题吗?或者我需要忽略这些日志行。 To get test ads on
我正在尝试遵循有关使用 Guice 作为 Web 服务器的最小教程,而不需要 web.xml:http://www.remmelt.com/post/minimal-guice-servlet-wit
我使用过滤器检查登录用户的 URL 模式。 但是我有很多 URL 模式需要过滤。 { "/table/*", "/user/*", "/contact/*", "/run/*", "/conf/*",
我创建了一个过滤器,我可以在其中访问有效负载的主体并对其执行一些逻辑(现在假设我记录主体)。在最后一步中,我返回了 Mono,但是当请求通过 Controller 继续发送到服务时,它会抛出请求正文丢
我正在尝试实现一个 WebFilter 来检查 JWT 并在检查失败或结果无效时抛出异常。我有一个处理这些异常的 @ControllerAdvice 类。但它不起作用。 这是 WebFilter 类:
我在 header 中使用 JWT 来验证用户请求。 @Override public Mono filter(ServerWebExchange exchange, WebFilterChain c
在我的应用程序中,我有一个 WebFilter。这个 Webfilter 应该检查一个 coockie。但是使用 FacesContext.getCurrentInstance() 会导致 Nullp
我是一名优秀的程序员,十分优秀!