权限(二)--权限的控制(过滤器与自定义标签)
来源:互联网 发布:mac电脑忘记密码 编辑:程序博客网 时间:2024/06/07 13:42
一、
接着上一篇的说 权限(一)--用户、权限组以及权限的分配
权限的控制分为两块:
1.页面的控制(没用权限的不让他看到页面)
2.过滤控制(就算知道url,没有权限也不让进)
在项目中,都是由一个人来负责权限部分的编写,然后其他人的活中多少会涉及到一些权限相关的。
所以,权限控制的通用性是非常重要的(总不能每次写到就找写权限部分的那个人,问他怎么弄)。
测试demo包:
权限控制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;@Overridepublic void destroy() {}@SuppressWarnings("unchecked")@Overridepublic 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");}@Overridepublic 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;@Overridepublic 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>
五、测试
好了,亲测好使。。。
下载地址:
权限控制Demo
记得查看readme.txt文件
0 0
- 权限(二)--权限的控制(过滤器与自定义标签)
- 权限(二)--权限的控制(过滤器与自定义标签)
- 权限(二)--权限的控制(过滤器与自定义标签)
- 自定义标签实现网站权限的控制
- 自定义标签实现网站权限的控制
- freemarker 自定义标签控制权限
- JSP权限控制(二)
- JSP权限控制(二)
- hive权限控制(二)
- 二进制权限控制(二)
- 自定义jsp标签实现页面元素的权限控制
- Struts 过滤器权限控制
- 自定义标签taglib控制页面元素权限
- 自定义标签 + shiro 实现权限细粒度控制
- 权限管理 之二 权限管理与访问控制概要设计(转载)
- 二十七、权限控制的自定义注解实现方式
- Java web自定义标签按钮级别权限控制完美诠释(jplogic 快速开发平台)
- 实现struts2的CRUD中的权限控制(二)
- Cocos2dx 物体按指定轨迹匀速运动 (坐标均距)
- ubuntu14.10 登录界面输入密码死循环问题
- BitConverter.GetBytes实现
- maven与springMVC之ModelAttribute、SessionAttributes
- 【POJ1325】机器调度
- 权限(二)--权限的控制(过滤器与自定义标签)
- C# PC端读取INI文件处理
- java 生成文字图片
- android ListView 左滑和IOS一样的效果
- Unity优化大全(六)之 GPU-动态阴影和Shader
- CCF模拟题4-有趣的数
- 92 图像有用区域【bfs+dfs(re)】
- 对象间的联动——观察者模式(三)
- 网站压力测试工具 webbench 安装配置