Struts2拦截器实现用户登录权限验证机制

2星 需积分: 16 5 下载量 142 浏览量 更新于2024-09-12 收藏 2KB TXT 举报
在Struts2框架中,拦截器(Interceptor)是核心组件之一,用于在Action执行前后进行额外的业务逻辑处理。在本示例中,我们探讨如何使用Struts2拦截器实现用户登录权限的验证。 首先,定义一个名为`AuthInterceptor`的拦截器类,该类继承自`AbstractInterceptor`。这个拦截器的主要职责是检查用户是否已经登录,即验证用户的登录状态。在`intercept`方法中,我们通过`ActionInvocation`对象获取到当前请求的上下文,然后从session中获取存储的用户信息。 ```java import java.util.Map; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class AuthInterceptor extends AbstractInterceptor { @Override @SuppressWarnings("unchecked") public String intercept(ActionInvocation invocation) throws Exception { Map map = invocation.getInvocationContext().getSession(); // 获取session if (map.get("user") == null) { // 检查session中是否有用户信息,如果没有,表示用户未登录 return Action.LOGIN; // 返回登录页面 } else { return invocation.invoke(); // 用户已登录,继续执行Action } } } ``` 在这个拦截器中,我们使用`@SuppressWarnings("unchecked")`注解来抑制可能的类型转换警告,因为`Map`的get方法返回的是`Object`类型,我们需要将其转换为我们期望的类型。 接下来,我们看一个简单的登录Action,名为`LoginAction`。在`execute`方法中,当用户名和密码匹配时,将有效的用户信息存入session: ```java public String execute() throws Exception { if ("hello".equals(this.getUsername().trim()) && "world".equals(this.getPassword().trim())) { Map map = ActionContext.getContext().getSession(); map.put("user", "valid"); // 将用户标识存入session,key为"user" return "success"; } else { this.addFieldError("username", "username or password error"); return "failer"; } } ``` 在这个Action中,如果用户名为"hello"且密码为"world",则将"valid"存入session,键为"user"。这意味着用户已经成功登录。如果用户名或密码错误,添加字段错误并返回"failer"视图,通常会显示错误消息。 为了使`AuthInterceptor`生效,需要在Struts配置文件(如struts.xml)中定义拦截器栈,并将`AuthInterceptor`加入其中。同时,需要指定哪些Action需要应用此拦截器,例如: ```xml <struts> <!-- ... --> <interceptors> <interceptor name="authInterceptor" class="com.example.AuthInterceptor"/> <interceptor-stack name="authStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="authInterceptor"/> </interceptor-stack> </interceptors> <package name="default" namespace="/" extends="struts-default"> <!-- ... --> <action name="login" class="com.example.LoginAction"> <result name="success">/success.jsp</result> <result name="failer">/error.jsp</result> </action> <!-- ... --> <action name="" class="com.exampleProtected.*Action"> <interceptor-ref name="authStack"/> <result name="success">/protected/success.jsp</result> <result name="login">/login.jsp</result> </action> </package> <!-- ... --> </struts> ``` 在上述配置中,`authStack`是包含默认拦截器栈和`authInterceptor`的拦截器栈。`login` Action不使用`authInterceptor`,因为它是用来处理登录请求的。而其他以`com.exampleProtected.*Action`开头的Action将使用`authStack`,因此在用户未登录的情况下会被重定向到登录页面。 通过创建和配置Struts2拦截器,我们可以实现用户登录权限的验证,确保只有已登录的用户才能访问特定的Action,从而保护了应用程序的安全性。拦截器机制使得这种验证逻辑可以独立于Action,提高了代码的可复用性和可维护性。