gpt4 book ai didi

java - 我如何处理/限制用户访问 servlet 和 jsp?

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:34 24 4
gpt4 key购买 nike

我目前正在用 Java 编写一个小型动态 Web 应用程序。该应用程序应该是一个事件平台,您可以在其中创建用户帐户、登录,然后您可以查看所有打开的事件(在以后的迭代中,用户可以创建/参与这些事件)。

现在,网络应用程序的结构可以(简化)如下描述:

Register-Servlet -> Register.jsp
|
V
Login-Servlet -> Login.jsp
|
V
Main-page-Servlet -> Main.jsp

所以现在,用户可以转到 Login.jsp,他的登录信息将被发送到 Login-Servlet,后者将对其进行验证,然后将其发送到 Main-Page-Servlet。Main-Page-Servlet 然后(再次验证登录后)从数据库中获取所有当前事件,将其附加到请求,并将其转发到 Main.jsp,后者将其显示给用户查看。

现在,如果用户想直接访问 Main.jsp(而不是来自 Main-Page-Servlet),显然无法显示可用事件。我目前使用的解决方法是进行空检查以查看事件是否存在,如果不存在,则重定向到 Main-Page-Servlet。

像这样解决我的问题让我很困扰,因为我认为这不是最佳实践,而且我认为随着我的应用程序变得越来越大,它只会产生很多其他问题。

我对此的第一个想法是,如果我可以简单地向用户“隐藏”所有 .jsp 可能会很有用,这样用户将只登陆 servlet 而无法以不同的方式访问 .jsp。

有办法吗?或者,如果不是,如果我要编写专业的企业级应用程序,最佳实践解决方案是什么?

最佳答案

这可以在 Filter 中处理StackOverflow Servlet-Filter wiki 中有很好的解释和示例.

根据您的问题调整代码(注意 needsAuthentication 方法的添加和使用):

@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig config)
throws ServletException {
// If you have any <init-param> in web.xml, then you could get them
// here by config.getInitParameter("name") and assign it as field.
}

@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 requestPath = httpServletRequest.getRequestURI();

if (needsAuthentication(requestPath) ||
session == null ||
session.getAttribute("user") == null) { // change "user" for the session attribute you have defined

response.sendRedirect(request.getContextPath() + "/login"); // No logged-in user found, so redirect to login page.
} else {
chain.doFilter(req, res); // Logged-in user found, so just continue request.
}
}

@Override
public void destroy() {
// If you have assigned any expensive resources as field of
// this Filter class, then you could clean/close them here.
}

//basic validation of pages that do not require authentication
private boolean needsAuthentication(String url) {
String[] validNonAuthenticationUrls =
{ "Login.jsp", "Register.jsp" };
for(String validUrl : validNonAuthenticationUrls) {
if (url.endsWith(validUrl)) {
return false;
}
}
return true;
}
}

我建议将所有需要身份验证的页面移动到app 之类的文件夹中,然后将网络过滤器更改为

@WebFilter("/app/*")

通过这种方式,您可以删除过滤器中的needsAuthentication 方法。

关于java - 我如何处理/限制用户访问 servlet 和 jsp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18241008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com