一、
接着上一篇的说 权限(一)--用户、权限组以及权限的分配
权限的控制分为两块:
1.页面的控制(没用权限的不让他看到页面)
2.过滤控制(就算知道url,没有权限也不让进)
在项目中,都是由一个人来负责权限部分的编写,然后其他人的活中多少会涉及到一些权限相关的。
所以,权限控制的通用性是非常重要的(总不能每次写到就找写权限部分的那个人,问他怎么弄)。
测试demo包:
二、过滤器
在访问url之前,进行一次过滤,同时查看当前用户是否有访问该url的权限。
为了保证通用性,这里使用一个map来记录url与权限的映射关系。
当其他开发者编写到需要权限控制的页面时,只需要将页面的url以及对应需要哪种权限的映射对放入到数据库中。
在应用发布的时候,加载映射到内存即可。
在过滤的时候:
1.通过url查看映射表,判断当前url是否需要权限,如果需要,需要什么权限
2.通过查找到的权限,与session中保存的权限比,看session中是否有需要的权限
session的权限查找用的比较多,所以使用HashSet实现O1时间查找。
package com.privilege.filter; import java.io.IOException; import java.util.HashSet; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.privilege.utils.PrivilegeUrlMapping; public class PrivilegeFilter implements Filter { private static String CONTEXT_PATH = null; @Override public void destroy() { } @SuppressWarnings("unchecked") @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; String requestPath = request.getRequestURI(); String target = requestPath.replace(CONTEXT_PATH, ""); // 如果不需要权限,放行 if (!PrivilegeUrlMapping.contains(target)) { chain.doFilter(request, response); return; } Object p = request.getSession().getAttribute("privilege"); // 如果session无记录,直接不给过 if (p == null) { defaultRedirect(response); return; } HashSet<Integer> privleges = (HashSet<Integer>) p; // 查找映射关系表 Integer code = PrivilegeUrlMapping.getPrivilegeCode(target); // 查看该用户是否包含此url的权限 if (privleges.contains(code)) { chain.doFilter(request, response); return; } // 权限不足,重定向到登录界面 defaultRedirect(response); } private void defaultRedirect(HttpServletResponse response) throws IOException { response.sendRedirect(CONTEXT_PATH + "/login.jsp"); } @Override public void init(FilterConfig config) throws ServletException { CONTEXT_PATH = config.getServletContext().getContextPath(); } }
三、页面处理
同样是为了实现通用,这里使用一个自定义标签
设想是这样的
<p:privilege target="2"></p:privilege>
使用这个一个标签,将需要权限判断的内容放入到其中,然后指定需要哪种权限。
自定义标签java代码:
package com.privilege.tag; import java.io.IOException; import java.util.HashSet; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; public class PrivilegeTag extends BodyTagSupport { private Integer target; @Override public int doEndTag() throws JspException { Integer code = getTarget(); Object p = pageContext.getSession().getAttribute("privilege"); if (p == null) { return SKIP_BODY; } HashSet<Integer> privilege = (HashSet<Integer>) p; //如果session中的privilege含有该权限,则显示其中的内容 //否则跳过 if (privilege.contains(code)) { try { pageContext.getOut().print(bodyContent.getString()); } catch (IOException e) { e.printStackTrace(); } return EVAL_PAGE; } return SKIP_BODY; } public Integer getTarget() { return target; } public void setTarget(Integer target) { this.target = target; } }
自定义标签配置文件(放在WEB-INF下):
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.2</tlib-version> <short-name>p</short-name> <uri>http://java.sun.com/jsp/jstl/privilege</uri> <tag> <name>privilege</name> <tag-class>com.privilege.tag.PrivilegeTag</tag-class> <body-content>JSP</body-content> <attribute> <name>target</name> <required>yes</required> </attribute> </tag> </taglib>
四、jsp页面
1.包含taglib
<%@ taglib prefix="p" uri="http://java.sun.com/jsp/jstl/privilege"%>
2.内容
<body> <p:privilege target="1"> <div>权限1能够看到</div> ${user.username} </p:privilege> <p:privilege target="2"> <div>权限2能够看到</div> ${user.username} </p:privilege> <p:privilege target="3"> <div>权限3能够看到</div> ${user.username} </p:privilege> </body>
五、测试
好了,亲测好使。。。
下载地址:
记得查看readme.txt文件
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-28 23:00:37