【发布时间】:2015-04-01 23:31:26
【问题描述】:
我有一个数据库,其中包含有关用户(用户名、密码、角色)的信息。我只想授予角色为“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();
}
}
我检查用户是否登录,而不是获取用户的角色。对于每个角色,我都会有一些页面。现在我只有匿名(未登录)用户。我有几个问题:
- 我检查用户是否登录,如果没有
fc.doFilter(req, resp);。据我了解,它必须进入下一个“链”。而这里我只有一个“链”,所以它必须关闭 doFilter。但事实并非如此。过滤器将在其他地方结束。 - 我可以仅使用
return ;结束过滤器,并且在此过滤器之后可以用于其他页面吗? -
为什么之后
RequestDispatcher dis = httpReq.getRequestDispatcher("/"); dis.forward(httpReq, resp);doFilter 仍然有效吗?我们有新页面,所以它必须停止这个 doFilter 并为新页面创建新的 doFIlter。
【问题讨论】:
-
forward和doFilter仍然是普通的 Java 方法调用,所以当你调用它们时,它们会在一段时间后返回到你的代码中。
标签: java jsp servlets servlet-filters