`
ysen
  • 浏览: 122229 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在action方法上定义注解通过拦截器解析

    博客分类:
  • ssh
阅读更多

通过命名规则规定action类名对应模块标示名,  action中方法名对应模块的crud 权限值,

add*对应添加权限,del*对应删改,update*对应更改,其它方法为查询权限。

及时认证权限的时候有的action命名难以对应,需要配置xml 或者 定义注解 通过拦截器解析转换 

 

 

 

一、注解类源码

 

@Retention(RetentionPolicy.RUNTIME)//运行时解析
@Target(ElementType.METHOD)//在方法中定义
public @interface AuthPermission {
	public String moduleSn() default "";
	public int permission() default -1;
	public boolean ignore() default false;
}

 

 

二、被注解的类ignore=true 不需要及时认证

 

@Controller("loginAction")
@Scope("prototype")
public class LoginAction {
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Resource
	private UserManager userManager;
	
	@Resource
	private AclManager aclManager;
	
	//执行登录操作
	public String execute(){
		
		User user = userManager.login(username, password);
		
		ServletActionContext.getRequest().getSession().setAttribute("login", user);
		
		return "back_index";
	}
	
	@AuthPermission(ignore=true)
	public String outlook(){
		
		User user = (User)ServletActionContext.getRequest().getSession().getAttribute("login");
		
		List modules = aclManager.searchModules(user.getId());
		
		ActionContext.getContext().put("modules", modules);
		
		
		return "outlook";
	}
	
	@AuthPermission(ignore=true)
	public String main(){
		
		return "main";
	}
}

 

 

 

三、定义及时认证的拦截器

public class AuthInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		
		//从http session中获取用户的ID
		int userId = ((User)ServletActionContext.getRequest()
				.getSession().getAttribute("login")).getId();
		
		//取出action的名称,作为当前正在请求的模块的唯一标识
		String actionName = invocation.getProxy().getActionName();
		String moduleSn = actionName;
		
		int permission = Permission.READ;
		
		//根据请求的方法的名称,来判断要执行的操作
		String methodName = invocation.getProxy().getMethod();
		if(methodName != null){
			if(methodName.startsWith("add")){
				permission = Permission.CREATE;
			}
			if(methodName.startsWith("update")){
				permission = Permission.UPDATE;
			}
			if(methodName.startsWith("del")){
				permission = Permission.DELETE;
			}
		}
		
		boolean ignore = false;

		//如果定义了注解,则使用注解中的配置信息
		Method method = invocation.getAction().getClass().getMethod(methodName);
		AuthPermission ap = method.getAnnotation(AuthPermission.class);
		if(ap != null){
			if(!ap.moduleSn().equals("")){
				moduleSn = ap.moduleSn();
			}
			if( ap.permission() != -1){
				permission = ap.permission();
			}
			ignore = ap.ignore();
		}
		
		if(!ignore){
			BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext());
			AclManager aclManager = (AclManager)factory.getBean("aclManager");
			if(!aclManager.hasPermissionByModuleSn(userId, moduleSn, permission)){
				throw new RuntimeException("您无权执行本操作,请联系系统管理员!");
			}
		}
		return invocation.invoke();
	}

}

 

注解的总结

 

 

 用于控制类方法的调用,只有拥有某个角色时才能调用。

分享到:
评论
3 楼 former 2010-03-31  
可以用spring security拦截url做正则匹配来授权——其实也是filter。
不推荐直接访问jsp的做法,不安全,复杂的适合,封装也不是太好。在我们的应用中,jsp都放在WEB-INF下。
2 楼 ysen 2010-03-29  
nothink 写道
这样的做法并不可取。因为有时候会直接调用了jsp。那你的interceptor就失效了。所以我觉得如果是做这个功能。最好还是转换成filter去实现。但是用filter就与sturts2无关了。

有道理
1 楼 nothink 2010-03-29  
这样的做法并不可取。因为有时候会直接调用了jsp。那你的interceptor就失效了。所以我觉得如果是做这个功能。最好还是转换成filter去实现。但是用filter就与sturts2无关了。

相关推荐

    Struts2 拦截器注解(二十七)

    此外,Struts2还提供了`@InterceptorRef`注解,允许在Action类或方法上引用已定义的拦截器栈,以便应用多个拦截器。 至于压缩包中的`WebRoot`和`src`目录,它们分别代表Web应用的根目录和源代码目录。`WebRoot`通常...

    两篇网文:拦截器 Common-FileUpload

    在"Struts2拦截器学习.doc"中,可能会详细讲解如何定义、配置和使用拦截器,包括在struts.xml配置文件中声明拦截器,以及使用@InterceptorRef注解在Action类中引用拦截器。 接下来是Common-FileUpload组件。在...

    struts2类型转换 拦截器 校验的例子

    在struts.xml配置文件中,你可以通过`<interceptors>`标签定义拦截器栈,并通过`<action>`标签中的`interceptor-ref`指定使用哪些拦截器。 然后,我们关注的是**校验(Validation)**。Struts2提供了基于注解和XML...

    struts拦截器防止未登陆访问内部系统

    拦截器类的配置方式则可通过一次定义,在多个Action中重复使用,体现了AOP的非侵入式编程原则。 #### 四、登录页面与全局转向配置 - `login.jsp`:设计为简单的登录界面,收集用户输入的用户名和密码。 - `login-...

    SSH框架注解方式,struts自身创建Action

    在注解方式下,我们不再需要传统的`struts.xml`配置文件,而是可以直接在Action类上使用`@Action`注解来定义动作。例如: ```java @Action(value = "login") public class LoginAction { // ... } ``` 这里的`...

    通过实例解析java过滤器和拦截器的区别

    通过实例解析Java过滤器和拦截器的区别 Java过滤器和拦截器是两个常用的Web应用程序组件,它们之间的区别是什么呢?本文将通过实例解析,详细介绍Java过滤器和拦截器的区别,帮助读者更好地理解和应用它们。 1. ...

    Struts2转换器、拦截器、验证以及国际化

    ### Struts2转换器、拦截器、验证以及国际化深度解析 #### 类型转换概述与实践 类型转换在Struts2框架中扮演着至关重要的角色,它解决了前端展示数据与后端处理数据之间的类型不匹配问题。在Web开发中,前端往往以...

    ssm框架学习之(一) --struts2 注解

    - `@Interceptors`: 用于在方法上指定一组拦截器,可以替代XML配置文件中的拦截器栈定义。 5. **其他注解**: - `@Namespace`: 定义Action类的命名空间,方便管理不同模块的请求路径。 - `@ParentPackage`: 指定...

    struts2支持方法上传递参数

    Struts2作为一款流行的Java Web框架,为开发者提供了丰富的功能,...开发者可以通过直接在方法签名中定义参数来处理用户请求,而无需额外的注解或配置。结合OGNL和拦截器,Struts2提供了高度灵活的Web应用开发框架。

    struts2 interceptor annotation plugin

    在Struts2中,通过在Action类或方法上使用特定的注解,可以方便地声明和配置拦截器。 例如,`@SkipValidation`注解可以用于跳过某个Action方法的数据验证,`@Action`注解则可以用来定义Action的基本属性,如结果...

    STRUTS 2技术内幕 深入解析STRUTS架构设计与实现原理

    4. **执行拦截器:** 在执行Action之前,会按照拦截器栈中定义的顺序执行一系列拦截器。 5. **执行Action:** Action执行具体的业务逻辑,并返回一个结果对象。 6. **处理结果:** 根据Action返回的结果对象选择合适...

    struts多个action处理

    在`struts.xml`配置文件中,我们需要为每个Action定义一个唯一的`name`,这将成为URL的一部分。例如: ```xml <action name="action1" class="com.example.Action1"> <result name="success">/success.jsp </...

    传智播客struts2.1视频教程_源代码_Action配置的各项默认值

    5. **Action配置中的默认拦截器栈**:Struts2使用拦截器来增强Action的功能,如验证、日志、文件上传等。默认的拦截器栈包括`params`、`i18n`、`validation`和`defaultStack`等。开发者可以根据需求自定义拦截器栈。...

    struts2 action 返回json方法(一)源码

    在Struts2的配置文件(struts.xml或struts-default.xml)中,为Action定义一个`json`结果。例如: ```xml <action name="myAction" class="com.example.MyAction"> </action> ``` 这里,`myAction`是我们...

    Struts2+技术内幕——深入解析Struts2架构设计与实现原理

    XML配置文件可以定义Action、结果类型、拦截器栈等,而基于注解的配置则提供了更简洁的方式。书中会详细阐述这两种配置方式的使用和优缺点。 此外,Struts2还与Spring等其他框架有良好的集成,可以通过Spring插件...

    java/ssh注解

    2. **Struts2框架注解**:Struts2允许在Action类和方法上使用注解,如`@Action`定义动作,`@Result`定义结果映射,`@InterceptorRef`引用拦截器。 3. **Hibernate框架注解**:Hibernate ORM使用注解进行对象关系...

    spring和Struts2注解文档

    Struts2的注解支持是通过拦截器(Interceptor)实现的,与Spring不同,它主要集中在Action的定义和配置上。 #### 2.2 Struts2注解介绍 ##### 2.2.1 @Action注解 这是Struts2中最核心的注解,用于定义Action类,...

    struts2 经典案例。运行调试通过,代码规范全解析。

    1. Action配置:在struts.xml中定义Action,包括Action的类名、方法名、结果类型及对应的视图页面。 ```xml <action name="exampleAction" class="com.example.ExampleAction"> <result name="success">/success....

    struts2.0Demo new

    Struts2支持使用注解来替代XML配置,可以在Action类和方法上添加注解,简化配置。 5. **Tiles插件** Struts2的Tiles插件允许创建复杂的页面布局,通过定义模板和组合多个组件来构建视图。 6. **国际化与本地化**...

    Struts中等同于DispatchAction类方法

    在更现代的Struts版本,如Struts 2,已经提供了更优雅的方式来实现多方法调用,例如使用`@Action`注解和拦截器来实现方法分发,这样既可以保持代码的整洁,又能提高安全性。 总结来说,"Struts中等同于...

Global site tag (gtag.js) - Google Analytics