我正在使用JSP和Tomcat作为我的服务器来处理这个应用程序。
我正在尝试设置授权级别,以便某些类别的用户可以执行某些操作(访问某些页面,例如创建新记录或搜索过去的记录),例如创建新用户只能由管理员完成。
我现在所做的是先:
<%
String user = request.getParameter("name");
String pwd = request.getParameter("password");
String sql = "select * from members where name = ? and password = ?";
int role = 0;
// since execute returns an int of 1 or 0, we can use it for our if-else statement
if (BaseDAO.check(sql, user, pwd) != 0) {
session.setAttribute("user", user);
role = BaseDAO.checkRole(sql, user, pwd);
session.setAttribute("role", role);
response.sendRedirect("frameMgr.jsp");
} else {
session.setAttribute("login", 0);
response.sendRedirect("loginPage.jsp");
}
%>
登录成功后,我会从数据库中提取角色值并将其设置为会话属性。然后在我的createNewUser页面,我有这个来检查用户是否具有指定的角色
<%
int role = (Integer) session.getAttribute("role");
// only allow people with admin role to create more accounts
if (role != 5) {
response.sendRedirect("frameContent.jsp"); //back to homepage
}
%>
然而,我意识到这种方法效率低下,因为我必须对每一页进行检查,如果将来有变化,我将不得不逐页进行更改代码。 是否有一种方法可以单独控制一个页面上的所有授权级别?而不是必须在我的所有jsp文件上执行此操作
答案 0 :(得分:1)
您可以做的最好是使用HTTP filter。每个请求都将通过您的过滤器进行验证。当然,这只会阻止用户访问资源(页面/图像等)。但它不会作为您的方法和用户交互的授权者。
@WebFilter("/*")
每个资源@WebFilter("/user/*")
用户文件夹下的资源@WebFilter("/admin/*")
管理文件夹下的资源@WebFilter("/what/ever/*")
示例:
@WebFilter("/user/*")
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
if (/*Check if user is logged*/) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
res.sendRedirect(req.getContextPath() + "/login.jsp");
}
}
@Override
public void destroy() {
}
}