转自 http://www.open-open.com/lib/view/open1358472021196.html
简介
本文介绍一种采用annotation来对spring-mvc进行权限控制的方法. 通过枚举类来定义权限项. 将annotation标注到需要控制权限的spring-mvc方法上. 然后,在spring-mvc中定义全局过滤器, 过滤所有spring-mvc方法, 查看方法上的权限annotation信息, 以此对权限进行控制.
优点
编写比较方便, 在需要控制权限的方法上进行annotation的标注即可, ide能够对annotation进行识别支持. 查看权限配置比较方便, 因为annotation就在方法上, 不用去其他地方翻看. 实现方式比较简单.
具体实现
1.建立权限枚举类
建立权限枚举类型, 用于描述权限的种类, 包含了权限的名称. 每个枚举值中包含了权限中文名称和权限索引值(即权限位). (思考:是否可以直接用中文名称作为枚举值的名称,我在其他程序已经用了中文枚举名称了,暂时没有遇到问题)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public enum AuthorityType{
// 包含了枚举的中文名称, 枚举的索引值 WORKER( "增删改查员工" , 1 ),
SALES_ORDER_CREATE( "创建订单" , 6 ),
SALES_ORDER_FIND( "查看订单" , 7 ),
SALES_ORDER_MODIFY( "修改订单" , 8 ),
SALES_ORDER_DELETE( "删除订单" , 9 ),
; private String name;
private int index;
private AuthorityType(String name, int index) {
this .name = name;
this .index = index;
} public String getName() {
return name;
} public void setName(String name) {
this .name = name;
} public int getIndex() {
return index;
} public void setIndex( int index) {
this .index = index;
} } |
2.登录方式的枚举类
登录方式的枚举类, page代表传统登录页面, json表示ajax的登录
1
2
3
4
5
6
|
public enum ResultTypeEnum {
//整页刷新 page, //json数据 json } |
3.建立表示权限annotation类
建立annotation类, 用于标注到需要权限验证的地方
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target (ElementType.METHOD)
@Retention (RetentionPolicy.RUNTIME)
@Documented public @interface FireAuthority {
AuthorityType[] authorityTypes();
ResultTypeEnum resultType() default ResultTypeEnum.page;
} |
4.在user类中加入权限字段
在user用户类中添加文本字段表示权限, 字段长度为250字符(因为mysql默认255个字符,可以代表250个权限应该够用了), 字符内容是0或者1. 1表示有权限, 0表示无权限. 提示: 对于用户的权限配置, 只要将对应的权限位设置为0或者1即可.
1
2
3
4
5
6
|
create table user (
id integer not null auto_increment,
name varchar (255),
right_content varchar (255),
primary key (id)
) type=InnoDB
|
5.权限验证算法
权限判断方法, 权限判断的实现算法, 用于判断是否有权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class AuthorityHelper {
/** * 判断是否有权限
* @param akey aString中位置的索引值,也就是权限位
* @param aString 权限字段,比如 11010101011101
* @return
*/
public static boolean hasAuthority( int akey,String aString){
return ConstanHelper.getAuthorityVaule(akey,rc);
if (aString== null || "" .equals(aString)){
return false ;
}
char value = aString.charAt(akey);
if (value == '1' ){
return true ;
}
return false ;
} } |
6.建立控制权限的interceptor类
建立interceptor类, 用于过滤需要控制权限的方法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter {
final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug( "" );
HandlerMethod handler2=(HandlerMethod) handler;
FireAuthority fireAuthority = handler2.getMethodAnnotation(FireAuthority. class );
if ( null == fireAuthority){
//没有声明权限,放行
return true ;
}
logger.debug( "fireAuthority" , fireAuthority.toString());
HttpSession session = request.getSession();
Worker manager = (Worker)session.getAttribute(SessionHelper.WorkerHandler);
boolean aflag = false ;
for (AuthorityType at:fireAuthority.authorityTypes()){
if (AuthorityHelper.hasAuthority(at.getIndex(), manager.getRightContent())== true ){
aflag = true ;
break ;
}
}
if ( false == aflag){
if (fireAuthority.resultType() == ResultTypeEnum.page) {
//传统的登录页面
StringBuilder sb = new StringBuilder();
sb.append(request.getContextPath());
sb.append( "/oprst.jsp?oprst=false&opmsg=" ).append(URLEncoder.encode(ControllerProperty.NOT_HAVE_AUTHORITY, "utf-8" ));
response.sendRedirect(sb.toString());
} else if (fireAuthority.resultType() == ResultTypeEnum.json) {
//ajax类型的登录提示
response.setCharacterEncoding( "utf-8" );
response.setContentType( "text/html;charset=UTF-8" );
OutputStream out = response.getOutputStream();
PrintWriter pw = new PrintWriter( new OutputStreamWriter(out, "utf-8" ));
pw.println( "{\"result\":false,\"code\":12,\"errorMessage\":\"" +ControllerProperty.NOT_HAVE_AUTHORITY+ "\"}" );
pw.flush();
pw.close();
}
return false ;
}
return true ;
}
} |
7.配置interceptor类
在spring-mvc中配置interceptor, 实现过滤.
1
2
3
|
< mvc:interceptors >
< bean class = "interceptor.AuthorityAnnotationInterceptor" ></ bean >
</ mvc:interceptors >
|
8.标注需要控制权限的方法
在需要控制访问的spring-mvc方法上面加上对应的标注.
//方式一
1
2
3
4
5
|
@FireAuthority (AuthorityType. SALES_ORDER_CREATE)
@RequestMapping (value= "/save.spr" , method=RequestMethod.POST)
public ModelAndView save(String name) throws Exception {
//some code
} |
//方式二
1
2
3
4
5
|
@FireAuthority (authorityTypes = {AuthorityType.SALES_ORDER_DELETE,AuthorityType.SALES_ORDER_CREATE})
@RequestMapping (value= "/save.spr" , method=RequestMethod.POST)
public ModelAndView save(String name) throws Exception {
//some code
}
|
//方式三
1
2
3
4
5
|
@FireAuthority (authorityTypes = AuthorityType.SALES_ORDER_DELETE, resultType=ResultTypeEnum.page)
@RequestMapping (value= "/save.spr" , method=RequestMethod.POST)
public ModelAndView save(String name) throws Exception {
//some code
} |
相关推荐
【Java-SpringMVC-毕业设计-源代码】是一个典型的基于Java技术栈的Web应用程序,主要应用于餐馆点餐系统的开发。这个项目展示了如何利用SpringMVC框架构建一个完整的业务流程,包括用户界面、后端服务以及数据库交互...
"Shiro+SpringMVC权限管理"是一个常见的解决方案,用于构建高效、安全的学生信息管理系统。这个系统利用了SpringMVC作为前端控制器框架,而Apache Shiro作为安全组件,实现了用户身份验证、授权和会话管理等功能。 ...
在权限管理中,SpringMVC可以作为前端控制器,负责接收用户的请求,根据权限判断是否允许访问特定的资源。 1. **SpringMVC的角色**:在权限管理中,SpringMVC可以通过拦截器(Interceptor)实现对请求的预处理。...
- **认证与授权**:可以使用Spring Security或OAuth2等工具实现身份验证和权限控制。 - **版本管理**:为API添加版本号,避免不同版本之间的冲突。 - **文档化**:使用Swagger等工具自动生成API文档,便于开发者理解...
**SpringMVC+Shiro权限管理** 在现代Web应用程序开发中,权限管理和用户认证是至关重要的组成部分。SpringMVC和Apache Shiro都是Java领域中广泛使用的框架,它们各自在不同的层面上提供了强大的功能。SpringMVC是...
### SpringMVC+Shiro权限管理系统详解 #### 权限管理概述 权限管理在软件开发中扮演着至关重要的角色,特别是在涉及多用户交互的应用场景下。通过合理的权限控制,可以确保不同用户仅能访问和操作他们被授权的功能...
总之,"springmvc+extjs4mvc实现权限管理"项目展示了如何结合服务器端的SpringMVC和客户端的ExtJS4MVC来构建一个完整的权限管理系统,它涉及到了认证、授权、UI设计等多个关键环节,对于学习和实践企业级应用的权限...
SpringMVC作为MVC设计模式的实现,它将应用逻辑分离开来,使得开发者可以独立地处理业务逻辑(Controller)、数据模型(Model)和用户界面(View)。这样有利于代码的维护和测试。 2. **DispatcherServlet** ...
8. **拦截器**:扩展了SpringMVC的拦截器机制,允许开发者自定义拦截逻辑,用于权限控制、日志记录等功能。 9. **工具类**:提供了一系列实用的工具类,如字符串操作、日期时间处理、JSON转换等,方便开发者进行...
SpringMVC 拦截器项目是一个典型的 Web 应用开发示例,它利用 SpringMVC 框架中的拦截器(Interceptor)机制来实现特定的功能,如权限控制、日志记录、性能统计等。SpringMVC 是 Spring 框架的一部分,专为构建基于 ...
《权限管理系统:Hibernate+Spring+SpringMVC整合实践》 在现代企业级应用开发中,权限管理系统是不可或缺的一部分,它负责管理和控制用户对系统资源的访问权限,确保系统的安全性和数据的完整性。本项目采用经典的...
首先,SpringMVC是Spring框架的一部分,它通过Model-View-Controller(MVC)设计模式来分离应用程序的业务逻辑、数据和用户界面。在本示例中,你将找到如何使用SpringMVC实现数据的增删改查操作。这通常涉及到与...
该系统是一款基于ExtJS和SpringMVC架构的权限配置系统,源码包含3417个文件,涵盖1825个PNG图片、1204个GIF图片、158个SCSS样式表、93个Java源代码、79个JavaScript文件、31个CSS样式表、12个XML配置文件、5个Ruby...
学习SpringMVC不仅意味着掌握MVC设计模式,还包括理解依赖注入、AOP(面向切面编程)等Spring核心特性,这些都对提升开发者技能有着深远影响。 总之,"springMVC框架学习备份"涵盖了SpringMVC的基础理论、工作流程...
SpringMVC是一个广泛使用的Java Web开发框架,它遵循Model-View-Controller(MVC)设计模式,简化了构建可维护和高性能的企业级应用程序的复杂性。以下是SpringMVC框架的一些核心概念和流程的详细解释: 一、Spring...
SpringMVC是Spring框架的一个模块,专为构建Web应用程序而设计。它是一个基于模型-视图-控制器(MVC)架构的轻量级Java Web框架,提供了强大的数据绑定、校验和类型转换功能,简化了Java Web开发流程。在"狂神说...
它是模型-视图-控制器(MVC)设计模式的实现,极大地简化了Java Web开发。本资料包包含丰富的SpringMVC学习资源,提供了代码示例和详细介绍,对于深入理解和掌握SpringMVC非常有帮助。 一、SpringMVC基础 SpringMVC...
此外,SpringMVC还支持视图技术,如JSP、FreeMarker或Thymeleaf等,以及RESTful风格的URL设计,使得API接口的构建更为简单。 通过这个完整的源码实例,我们可以学习到SpringMVC的整个生命周期,包括请求处理、模型...
- **架构设计**:SpringMVC遵循典型的MVC架构,而Struts2则采用了拦截器架构。 - **性能表现**:SpringMVC通常被认为在性能方面优于Struts2。 - **配置方式**:SpringMVC倾向于XML和注解结合的方式,而Struts2则依赖...
在SpringMVC中,可以通过Controller从Service获取当前用户的角色和对应的菜单权限,然后将数据传递给EasyUI的菜单组件来生成菜单。 【数据列表动态显示】 数据列表动态显示是指根据用户查询条件,从数据库中获取...