使用过滤器来限制 JSP 访问?

Posted

技术标签:

【中文标题】使用过滤器来限制 JSP 访问?【英文标题】:Using Filters to Restrict JSP Access? 【发布时间】:2011-10-11 03:17:57 【问题描述】:

我使用来自 JSP 的 javascript 调用使用 AJAX 调用和服务器端请求的原型框架登录,我设置了一个过滤器来拦截所有请求,以便我可以重定向到登录页面或继续。

我遇到的问题是,如果您在浏览器中的 URL 中键入路径以转到其他页面,则无法在页面加载之前对其进行过滤,因为它不是 AJAX 请求,并且在某些情况下没有HTTPWebRequest 直到在页面上按下按钮..

处理此问题的最佳方法是什么?

谢谢!

【问题讨论】:

HttpWebRequest 是 ASP.NET/C# 特定的。在 JSP/Servlet 中,它是 HttpServletRequest。请注意正确的类名。 【参考方案1】:

我了解到您没有使用 Java EE 提供的容器管理身份验证。它会在正确配置时自动考虑到这一点。

使用自主开发的身份验证系统,通常的做法是将登录用户作为属性放在会话范围内,以便您的代码的剩余部分可以拦截它,servlet filters 也是如此。

假设您的登录方法如下所示:

User user = userService.find(username, password);

if (user != null) 
    request.getSession().setAttribute("user", user);


// ...

那么你可以在过滤器中执行以下操作:

@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);

    if (session == null || session.getAttribute("user") == null) 
        response.sendRedirect("login.jsp"); // No logged-in user found, so redirect to login page.
     else 
        chain.doFilter(req, res); // Logged-in user found, so just continue request.
    

将此过滤器映射到覆盖受保护页面的 URL 模式,例如/app/* 什么的。

【讨论】:

如果可能,我会使用基于表单的登录,但我不确定如何或是否可以在不使用应用服务器的情况下设置领域等?所有用户都来自数据库,并且也会从那里获得角色,那么有没有办法在部署描述符或其他东西中利用它?我在网上找不到任何东西。 没有应用服务器?那么你是如何运行 webapp 的呢? 抱歉,我重读了一遍,并认为您会问我,抱歉,我的意思是不在应用服务器上配置用户和领域等,而是根据数据库中的用户检查用户名和密码... 如果您不想配置一个领域,那么您只需要自己开发。我假设您完全意识到您可以针对现有数据库完美地创建领域? 是的,我从来没有这样做过!非常感谢您的回答,我想我会尝试让这个过滤器正常工作!

以上是关于使用过滤器来限制 JSP 访问?的主要内容,如果未能解决你的问题,请参考以下文章

Jsp第五课 过滤器的概念与使用

JSP的过滤器

JSP 过滤器

如何在spring-mvc中根据域过滤请求

如何禁用从 url 直接访问 jsp 页面的页面

java会话过滤器