使用Filter完成一个简单的权限模型
1) 需求:
① 管理权限
》查看某人的权限
》修改某人的权限
②对访问进行权限控制:有权限则可以访问,否则提示:没有对应的权限,请返回
假设有四个权限对应着允许访问四个页面:
authority1 –>ariticle1.jsp
authority2 –>ariticle2.jsp
authority3 –>ariticle3.jsp
authority4 –>ariticle4.jsp
2) 实现
① 管理权限
》封装权限信息:Authority
Authority{
//显示到页面上的权限的名字
private String displayName;
//权限对应的URL地址,一个权限对应着一个URL(该案例中一个权限只能访问一个jsp页面)
private String url;
}
》封装用户信息:User
User{
private String username;
private List<Authority> authorities;
//...
}
》创建一个 UserDAO
//用于查看某人的权限
User get(String username);
//修改某人的权限
void update(String username, List<Authority>);
》页面实现
authority-manager.jsp :
* 有一个text文本框,仅供输入username,提交后,使用checkbox 显示当前用户所有的权限信息
* 检查request中是否有user信息,若有,则显示 xxx 的权限为:对应的权限的checkbox打上√
(提示:页面上需要通过两层循环的方式来筛选出选择的权限)
》Servlet
authority-manager.jsp 提交表单后:获取表单的请求参数:username,再根据username获取User信息,把user放入到request中,转发到authority-manager.jsp
authority-manager.jsp 修改权限的表单提交后:获取请求参数:username,authory(多选);把选项封装为List;调用UserDao的update() 方法实现权限的修改;重定向到authority-manager.jsp
② 对访问进行权限控制
》 使用filter 进行权限的过滤: 检验用户是否有权限,若有,则直接响应目标页面;
若没有重定向到403.jsp
使用filter如何进行过滤?
- 获取 ServletPath ,类似于/FilterDemo/article1.jsp
- 判断用户是否登录
- 在用户已经登录的情况下,获取用户信息 session.getAttribute(“user”);
- 再获取用户所具有的权限信息: List<Authority>
- 效验用户是否有请求 servletPath 的权限(思考: 除了遍历来比较判断以外是否有更好的解决方式)
- 若有权限则响应,若没有权限则重定向到403.jsp
Filter中的代码 :
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
System.out.println("ggggg");
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
//获取servletPath,类似于/FilterDemo/article1.jsp
String servletPath = request.getServletPath();
//不需要被拦截的url列表
List<String> uncheckedUrls = Arrays.asList("/403.jsp","/articles.jsp",
"/authority-manager.jsp","login.jsp","logout.jsp");
if(uncheckedUrls.contains(servletPath)){
chain.doFilter(request, response);
System.out.println("放行");
return;
}
//若用户未登录则直接重定向到login.jsp
User user = (User) request.getSession().getAttribute("user");
if(user == null){
response.sendRedirect(request.getContextPath() + "/login.jsp");
return;
}
//若用户已登录,得到该用户所拥有的权限的list
List<Authority> authorities = user.getAuthorities();
Authority authority = new Authority(null,servletPath);
//判断用户所拥有的权限中的ur列表是否包含请求的url,包含则放行,不包含则重定向到403.jsp
//需要在Authority中重写equals和hashCode方法,只需要比较url即可,不需要比较displayName
if(authorities.contains(authority)){
chain.doFilter(request, response);
return;
}
if(!authorities.contains(authority)){
response.sendRedirect(request.getContextPath() + "/403.jsp");
return;
}
}