权限(二)--权限的控制(过滤器与自定义标签)
2015-09-16 11:42
381 查看
一、
接着上一篇的说 权限(一)--用户、权限组以及权限的分配
权限的控制分为两块:
1.页面的控制(没用权限的不让他看到页面)
2.过滤控制(就算知道url,没有权限也不让进)
在项目中,都是由一个人来负责权限部分的编写,然后其他人的活中多少会涉及到一些权限相关的。
所以,权限控制的通用性是非常重要的(总不能每次写到就找写权限部分的那个人,问他怎么弄)。
测试demo包:
权限控制Demo
二、过滤器
在访问url之前,进行一次过滤,同时查看当前用户是否有访问该url的权限。
为了保证通用性,这里使用一个map来记录url与权限的映射关系。
当其他开发者编写到需要权限控制的页面时,只需要将页面的url以及对应需要哪种权限的映射对放入到数据库中。
在应用发布的时候,加载映射到内存即可。
在过滤的时候:
1.通过url查看映射表,判断当前url是否需要权限,如果需要,需要什么权限
2.通过查找到的权限,与session中保存的权限比,看session中是否有需要的权限
session的权限查找用的比较多,所以使用HashSet实现O1时间查找。
[java] view
plaincopy
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代码:
[java] view
plaincopy
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下):
[html] view
plaincopy
<?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
[html] view
plaincopy
<%@ taglib prefix="p" uri="http://java.sun.com/jsp/jstl/privilege"%>
2.内容
[html] view
plaincopy
<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文件
接着上一篇的说 权限(一)--用户、权限组以及权限的分配
权限的控制分为两块:
1.页面的控制(没用权限的不让他看到页面)
2.过滤控制(就算知道url,没有权限也不让进)
在项目中,都是由一个人来负责权限部分的编写,然后其他人的活中多少会涉及到一些权限相关的。
所以,权限控制的通用性是非常重要的(总不能每次写到就找写权限部分的那个人,问他怎么弄)。
测试demo包:
权限控制Demo
二、过滤器
在访问url之前,进行一次过滤,同时查看当前用户是否有访问该url的权限。
为了保证通用性,这里使用一个map来记录url与权限的映射关系。
当其他开发者编写到需要权限控制的页面时,只需要将页面的url以及对应需要哪种权限的映射对放入到数据库中。
在应用发布的时候,加载映射到内存即可。
在过滤的时候:
1.通过url查看映射表,判断当前url是否需要权限,如果需要,需要什么权限
2.通过查找到的权限,与session中保存的权限比,看session中是否有需要的权限
session的权限查找用的比较多,所以使用HashSet实现O1时间查找。
[java] view
plaincopy
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代码:
[java] view
plaincopy
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下):
[html] view
plaincopy
<?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
[html] view
plaincopy
<%@ taglib prefix="p" uri="http://java.sun.com/jsp/jstl/privilege"%>
2.内容
[html] view
plaincopy
<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文件
相关文章推荐
- Android SDK在线更新镜像服务器
- Hibernate执行原生sql将查询结果直接转为VO
- quartz cron表达式介绍
- ruby 使用gem安装换source
- Android framework系统默认设置修改
- VS2005格式化代码
- HDOJ-1521排列组合(指数型母函数)
- git 多个账号使用
- 名称空间也可以自定义
- frameset,iframe框架之间如何互相调用变量、函数
- FisrtWebApp
- 15-1系统裁剪 为服务加后缀
- FingerGestures研究院之初探Unity手势操作(一)
- 初探 Qt Opengl【2】
- HTTPS原理详解
- Skew Binary-1565
- html meta标签
- oracle中直方图的使用
- 如何用u盘装系统?UltraISO软件安装win7系统图文教程
- linux的任务前后台管理(bg和fg命令)