在我们基于 Java 的 Web 应用程序中,我们有角色和用户的概念。基本上我们的页面中有很多链接,这些链接可以根据分配给用户的角色来访问。角色和用户相关信息存储在数据库中。
在用户登录期间,我们查询数据库,获取所有相关角色并仅显示分配给他的角色的链接。所以用户只能看到他有权访问的链接。
这种方式非常有效。但是每次用户登录时,程序都会从数据库中检查他的角色级别。这是数据库的负担。请建议我们防止访问 Web 应用程序中的多个链接的另一种方法。
在我们基于 Java 的 Web 应用程序中,我们有角色和用户的概念。基本上我们的页面中有很多链接,这些链接可以根据分配给用户的角色来访问。角色和用户相关信息存储在数据库中。
在用户登录期间,我们查询数据库,获取所有相关角色并仅显示分配给他的角色的链接。所以用户只能看到他有权访问的链接。
这种方式非常有效。但是每次用户登录时,程序都会从数据库中检查他的角色级别。这是数据库的负担。请建议我们防止访问 Web 应用程序中的多个链接的另一种方法。
2个选项:
1)当他第一次通过身份验证时将用户角色放入会话中,并在他每次尝试访问功能时访问会话
2) 使用 aMap<String, List<Role>>
作为缓存并访问此映射而不是数据库来验证用户。地图的键可以是用户名。当用户登录时,将用户添加到地图中。当用户注销或会话到期时,从地图中删除。Spring Security 使用Ehcache进行缓存,因此您也可以这样做。
public void doLogin(HttpSevletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = service.authenticate(username, password);
HttpSession session = request.getSession();
session.setAttribute("roles", user.getRoles());
}
public void save(HttpServletRequest request) {
List<Role> roles = request.getSession().getAttribute("roles");
for(Role role : roles) {
if(role.getName()=="save") {
service.save();
break;
}
}
}
添加了一个简单的示例。对于缓存,它将是一个类似的,除了而不是会话使用 Map。