使用Filter完成一个权限过滤模型

使用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;
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值