自己做一个简单的东东,使用ssh,说实话strut2的拦截器感觉还是比较灵活,由于系统比较简单,权限验证就全部由一个拦截器完成
public class AuthorizeInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(AuthorizeInterceptor.class);
public static final String USR_KEY = "nbrc.user";
public static final String LOGIN_URL = "login";
@Override
public String intercept(ActionInvocation inv) throws Exception {
log.info("AuthorizeInterceptor进入拦截器");
Object action = inv.getAction();
if(action instanceof AuthorizeAction){
//需要验证的action全部实现AuthorizeAction接口
log.info("需要验证的action");
User u = (User) inv.getInvocationContext().getSession().get(USR_KEY);
if(u==null){
log.info("用户信息不存在");
return LOGIN_URL;
}else{
AuthorizeAction author = (AuthorizeAction) action;
author.setUser(u);
//把用户信息放入action上下文
if(author.validateUser()){
//action的validateUser方法判断用户是否有权限
log.info("验证用户通过");
return inv.invoke();
}else{
log.info("验证不通过,用户没有权限");
return LOGIN_URL;
}
}
}else{
log.info("不需要用户验证的action");
return inv.invoke();
}
}
@Override
public void destroy() {
}
@Override
public void init() {
}
}
后来发现,这样做有一个不好的地方,就是验证是action级别的,而不是方法级别的,粒度太大了,我自己的代码又比较乱,最近在看annotation相关的资料,心中一动,就想把验证的改成用annotation来实现,只需要在方法上标注可以调用该方法的角色,就可以了,拦截器的代码如下:
public class AuthorizeInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(AuthorizeInterceptor.class);
public static final String USR_KEY = "nbrc.user";
public static final String USR_LOG_CNT="nbrc.logincount";
public static final String USR_LAST_LOG="nbrc.lastlogin";
public static final String LOGIN_URL = "login";
@Override
public String intercept(ActionInvocation inv) throws Exception {
log.info("AuthorizeInterceptor进入拦截器");
Object action = inv.getAction();
User u = (User) inv.getInvocationContext().getSession().get(USR_KEY);
String method = inv.getProxy().getConfig().getMethodName();
Method m = action.getClass().getMethod(method);
String[] roles = null;
if(m.isAnnotationPresent(AllowRoles.class)){
AllowRoles ar = m.getAnnotation(AllowRoles.class);
roles = ar.roleNames();
if(isAllowed(roles,u)){
log.info("验证用户通过");
return inv.invoke();
}else{
log.info("验证不通过,用户没有权限");
return LOGIN_URL;
}
}else{
log.info("没有Annotation,直接运行");
return inv.invoke();
}
}
private boolean isAllowed(String[] roles, User usr) {
if(roles[0].equals("*") && usr!=null){
log.info("允许用户的权限:*");
return true;
}
if(usr!=null){
String priv = usr.getPriv();
for(String r : roles){
if(r.equals(priv)){
log.info("允许用户的权限:" + r);
return true;
}
}
}
return false;
}
@Override
public void destroy() {
}
@Override
public void init() {
}
}
annotation的定义如下:
@Retention(RetentionPolicy.RUNTIME)
public @interface AllowRoles {
public String[] roleNames();
}
匿名可访问的方法可以不用标注,如果是"*",表示需要登录的用户才能访问
@AllowRoles(roleNames="dangwei")
public String execute(){
//TODO:method here
}
分享到:
相关推荐
1. 创建权限拦截器:首先,我们需要编写一个实现了`Interceptor`接口的类,例如`AuthorizationInterceptor`。在这个类中,我们可以检查用户的登录状态、角色等信息,以确定他们是否有权限执行请求的操作。 2. 注册...
- XML配置:在`struts.xml`文件中,使用`<interceptor>`元素定义拦截器,`<interceptor-stack>`元素组合多个拦截器,`<package>`元素下的`interceptors`属性指定拦截器栈。 ```xml <!-- 可以添加其他内置或...
在`struts.xml`中,可以创建一个或多个拦截器栈,并将权限拦截器包含在内。 4. 应用拦截器:在Action配置中,通过`<interceptor-ref>`标签引用拦截器栈,确保在执行Action之前会经过权限拦截器的验证。 此外,还...
3. **权限验证**:拦截器可以实现用户登录检查,防止未授权的访问。 4. **数据校验**:在Action执行前,拦截器可以对输入数据进行校验,确保数据的合法性。 5. **业务逻辑增强**:如事务管理,可以在拦截器中进行...
在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在动作执行前后插入自定义的逻辑,如日志、权限检查、数据验证等。本示例将探讨如何在Struts2中使用拦截器。 首先,我们需要理解Struts2拦截器的...
标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...
总结来说,Struts2拦截器是框架的核心部分,它们提供了一种灵活的方式,以实现各种功能,如日志记录、性能监控、权限控制等,同时保持代码的整洁和模块化。通过对`98struts201`文件的深入研究,我们可以更好地掌握...
2. **注册拦截器**:在`struts-config.xml`配置文件中,通过`<interceptors>`标签定义拦截器栈,然后通过`<action>`标签的`interceptor-ref`属性引用拦截器栈。 3. **配置拦截器栈**:在`struts-config.xml`中,...
拦截器是在Action调用之前和之后执行的一段代码,可以用来做日志记录、权限检查、事务管理、性能监控等。这些操作无需在每个Action中重复编写,而是通过配置就可以全局应用。Struts2的拦截器基于AOP(面向切面编程)...
本文将深入探讨如何利用Struts2的拦截器实现简单的登录功能。拦截器是Struts2框架的核心组件之一,它允许我们在动作执行前后插入自定义逻辑,比如权限验证、日志记录等。 首先,我们来理解一下Struts2拦截器的工作...
在文章"Struts2拦截器原理分析实例"中,作者通过一个具体的应用场景,展示了如何配置和使用拦截器来实现特定的功能,比如日志记录或权限验证。通过阅读这篇博客,我们可以更直观地理解拦截器的工作方式和价值。 ...
拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...
例如,你可以创建一个新的拦截器来实现登录检查、权限控制或性能监控,然后将其添加到拦截器栈中。通过理解和研究Struts2的拦截器源码,我们可以更好地利用这个强大工具,提高应用的可扩展性和灵活性。同时,这也为...
拦截器在Struts1中扮演着重要角色,它允许开发者在动作执行前后插入自定义的逻辑,比如日志记录、权限验证、事务管理等。SAIF插件是Struts1中一个特定的拦截器实现,用于增强框架的功能。 **1. Struts1 拦截器原理*...
通过上述步骤,开发者可以轻松地为Struts2应用添加拦截器,实现诸如权限验证、日志记录、性能监控等额外功能,提高了代码的可维护性和可扩展性。在实际项目开发中,拦截器的应用非常广泛,是Struts2框架中不可或缺的...
在Struts2中,拦截器是基于Java的动态AOP(面向切面编程)实现的,它可以在Action调用前后插入额外的逻辑,比如日志记录、权限验证、事务管理等。拦截器通过配置文件或者注解与Action关联,形成一个拦截器栈,每个...
Struts2是一个强大的MVC框架,它通过使用拦截器(Interceptor)来实现业务逻辑与表现层的解耦,提供了一种灵活的扩展机制。在Struts2中,拦截器是AOP(面向切面编程)的一种实现,它可以监控、修改或增强方法调用的...
拦截器可以用来实现日志记录、权限检查、事务管理等通用功能。当一个请求到达时,Struts2会根据配置文件决定哪些拦截器需要被调用,并按照预定义的顺序执行。请求首先通过一系列拦截器,然后才到达Action,处理完...