实现基于url级别的权限控制

 很多系统只能控制到用户的菜单权限,而不能控制到用户直接输入url地址访问某些界面的权限,这个如何控制,比如用户张三没有菜单A(菜单A的action地址是:http://localhost:8080/xxx/xxx.do)的权限,用户直接输入这个地址却能访问这个界面。目前后很多的系统都存在这样的权限问题:

下面给出几种解决方法:
1.url过滤:直接加一个filter,判断该url是否是用户直接输入的权限(通过http请求头的referer属性。如果该属性为空,则说明是直接通过url直接访问的,该操作不能进行。)。当然这里要对例如首页或者登陆页面进行放行。过滤器的部分代码如下:

public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) throws IOException, ServletException { 
        HttpServletRequest req = (HttpServletRequest) request; 
        HttpServletResponse resp = (HttpServletResponse) response; 
        String conString = ""; 
        conString = req.getHeader("REFERER");//获取父url--如果不是用户直接输入的话就是先前的访问过来的页面,要是用户输入了,这个父url是不存在的。该属性常称为防盗链属性 
        if("".equals(conString) || null==conString){ //判断如果上一个目录为空的话,说明是用户直接输入url访问的 
            String servletPath = req.getServletPath();//当前请求url,去掉几个可以直接访问的页面 
            if(servletPath.contains("index.jsp") || servletPath.contains("login.jsp")){ //跳过index.jsp和登陆Login.jsp 
                chain.doFilter(request, response); 
            } else { 
                resp.sendRedirect("index.jsp");//跳回首页 
            } 
        } else { 
            chain.doFilter(request, response); 
        } 
    } 

这种方法有一定的局限性。用户体验也不太好:如果该用户有该权限,也不能通过这种方式去访问了。
下面这种可以解决这个问题:
2.开发约定:
约定开发人员 在所有url的路径里都包含菜单id, 比如 http://localhost:8080/菜单/xxx.do这样在url过滤的地方就可以知道当前url是属于哪个菜单的 然后再看当前user有没有这个菜单的权限。

你可能感兴趣的:(权限,filter,url,过滤器)