您的位置:首页 > 其它

权限(二)--权限的控制(过滤器与自定义标签)

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文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: