[英]Servlet jsp, authentication filters
我有一个数据库,其中包含有关用户的信息(用户名,密码,角色)。 我只想授予角色为“ 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 ;
就结束过滤器吗return ;
并在此过滤器之后适用于其他页面吗? 为什么之后
RequestDispatcher dis = httpReq.getRequestDispatcher("/"); dis.forward(httpReq, resp);
doFilter仍然有效吗? 我们有新页面,因此它必须停止此doFilter并为新页面创建新的doFIlter。
对于问题1:
Filter#doFilter
将执行以下操作:
如果需要限制对页面的访问,请不要使用doFilter
因为这意味着您接受来自客户端的请求。 而是根据您的要求使用转发或重定向。
对于问题2:
是的你可以。 毕竟,这是一种方法。 在调用return;
之前,请确保您在响应中写了正确的内容return;
在doFilter
。 编写响应的一种方法是使用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);
}
你要问: 为什么方法调用后,并没有停止System.out.println
内部控制线if
? 。 很简单:因为没有什么可以阻止方法的执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.