gpt4 book ai didi

java - Servlet jsp、身份验证过滤器

转载 作者:行者123 更新时间:2023-12-01 11:57:52 26 4
gpt4 key购买 nike

我有一个数据库,其中有有关用户的信息(用户名、密码、角色)。我想仅向具有“ROLE_USER”或“ROLE_ADMIN”角色的登录用户授予对某些页面的访问权限。 (管理员具有两种角色)

我正在尝试如何做到这一点:

我有一个过滤器,我正在检查用户是否登录等。

@WebFilter(urlPatterns={"/*"})
public class AuthorizationFilter implements Filter
{
public boolean isUser=false;
public boolean isAdmin=false;

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain fc) throws IOException, ServletException
{
HttpServletRequest httpReq = (HttpServletRequest) req;
HttpSession session = httpReq.getSession();
HttpServletResponse res = (HttpServletResponse) resp;
if (httpReq.getSession().getAttribute("user") == null)
{
fc.doFilter(req, resp);
}
String login = (String) session.getAttribute("user");

Connection con = Connector.getSimpleConnection();
PreparedStatement pst = null;
String sql = "select ROLE from user_roles where username = ?";
try
{
pst = con.prepareStatement(sql);
pst.setString(1, login);
ResultSet rs = pst.executeQuery();
while(rs.next())
{
if (rs.getString("ROLE").equals("ROLE_USER"))
{
isUser = true;
}
else
{
if (rs.getString("ROLE").equals("ROLE_ADMIN"))
{
isAdmin = true;
}
}
}

if (isAdmin)
{
System.out.println("ADmin");
fc.doFilter(req, resp);
}
if (isUser)
{
System.out.println("User");
fc.doFilter(req, resp);
}
else
{
String path = httpReq.getServletPath();
System.out.println(path);
if (path.equals("/") || path.equals("/login") ||
path.equals("/welcome.jsp") || (path.equals("/register")))
{
RequestDispatcher dis = httpReq.getRequestDispatcher(path);
dis.forward(httpReq, resp);
fc.doFilter(req, resp);
}
else
{
RequestDispatcher dis = httpReq.getRequestDispatcher("/");
dis.forward(httpReq, resp);
}

}

}
catch (SQLException e)
{
e.printStackTrace();
}


}

我检查用户是否已登录,然后获取用户的角色。对于每个角色我都会有一些页面。现在我只有匿名(未登录)用户。我有几个问题:

  1. 我检查用户是否已登录,如果未登录,则 fc.doFilter(req, resp); 。据我了解,它必须进入下一个“链”。这里我只有一个“链”,所以它必须关闭 doFilter。但事实并非如此。过滤器将在其他地方结束。
  2. 我可以仅用 return ; 结束过滤器吗?在此过滤器之后是否适用于其他页面?
  3. 为什么之后

     RequestDispatcher dis = httpReq.getRequestDispatcher("/");
    dis.forward(httpReq, resp);

    doFilter 仍然有效吗?我们有新页面,所以它必须停止这个 doFIlter 并为新页面创建新的 doFIlter。

最佳答案

对于问题 1:

Filter#doFilter 将执行以下操作:

  • 将请求和响应传递给链中的下一个过滤器。
  • 如果链中没有其他过滤器,它将把请求和响应传递给相关的 Servlet 来处理请求。
  • 处理请求后,它将继续使用链中的最后一个过滤器。

如果您需要限制对页面的访问,则不要使用doFilter,因为这意味着您接受来自客户端的请求。相反,根据您的要求使用转发或重定向。

对于问题 2:

是的,可以。毕竟这是一种方法。在调用 doFilter 中的 return; 之前,请确保您已在响应中写入正确的内容。编写响应的一种方法是使用 RequestDispatcher#forward 或重定向。

对于问题 3:

因为这只是一个方法的调用。想象一下你有一个这样的方法:

public void foo(int x) {
if (x < 10) {
System.out.println("x is less than 10, it's not acceptable.");
}
System.out.println("x value is: " + x);
}

您会问:为什么在调用 if 内的 System.out.println LoC 后该方法没有停止? 。很简单:因为没有任何东西阻止该方法的执行。

关于java - Servlet jsp、身份验证过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28287584/

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