Struts拦截器实现拦截未登录用户实例解析
什么是Struts拦截器?
Struts2拦截器是请求处理流程中的组件,它可以拦截一个请求和响应,也可以在一个请求被处理前或被处理后插入一些处理逻辑。对于网站的作者和开发人员来说,Struts2拦截器可以帮助我们快速构建一个完整的Web应用。
Struts拦截器如何实现拦截未登录用户?
Struts2开发框架允许开发者自定义拦截器,并且提供了一系列的拦截器接口用于自行接口。通过继承Struts2框架中的ActionSupport类及实现拦截器接口,我们可以在拦截器中实现用户登陆的检查逻辑,从而实现拦截未登录用户的目的。
下面是一个简单的实现未登录用户拦截的拦截器示例:
package com.example.interceptor;
import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.ActionContext;
/**
* 实现用户登录验证的Struts2拦截器
*/
public class LoginInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
System.out.println("LoginInterceptor destroy.");
}
@Override
public void init() {
System.out.println("LoginInterceptor init.");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("LoginInterceptor intercept.");
Map<String, Object> session = ActionContext.getContext().getSession();
if (session.containsKey("loginUser")) {
System.out.println("LoginInterceptor user has login.");
return invocation.invoke(); // 已登录用户继续执行Action
} else {
System.out.println("LoginInterceptor user not login, redirect to login page.");
return "login"; // 未登录用户跳转到登录页面
}
}
}
在上述代码中,我们通过实现Struts2的Interceptor接口,并重载其中的intercept方法实现了用户登录检查逻辑。在invocation.invoke()方法被调用时,表示已登录的用户,此时可以继续执行Action;但如果session中不包含登录用户的信息,那么我们将用户重定向到登录页面。
另一种示例代码
我们再来看一个更为完整的拦截未登录用户示例:
package com.example.interceptor;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.ActionContext;
/**
* 实现用户登录验证的Struts2拦截器
*/
public class LoginInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
// 取得请求
HttpServletRequest request = ServletActionContext.getRequest();
// 取得URL
String url = request.getRequestURI();
if (url.indexOf("login.action") > 0 || url.indexOf("register.action") > 0) {
System.out.println("LoginInterceptor doIntercept, do not intercept for login or register action.");
return invocation.invoke();// 登录和注册页面不拦截
} else {
System.out.println("LoginInterceptor doIntercept, intercept request.");
// 取得Session
Map<String, Object> session = ActionContext.getContext().getSession();
// 判断Session中是否存在登录用户的标识
if (session.containsKey("loginUser")) {
System.out.println("LoginInterceptor user has login. Invoke action.");
return invocation.invoke();// 已登录用户继续执行Action
} else {
// 未登录,重定向到登录页面
System.out.println("LoginInterceptor user not login, redirect to login page.");
return "login";
}
}
}
}
在还没有解析代码之前,我们先来分析一下上述例子的流程。该拦截器从HttpServletRequest中获取当前请求的Uri,如果request中不包含login和register字段的url,那么我们判断当前Session中是否包含用户登录信息。如果存在,则表示用户已经登录,我们让请求继续执行;如果没有,则重定向到登录页面。
代码解析
上面的示例代码是一个更完整的拦截未登录用户的Demo,我们来逐行分析一下代码:
- 继承了Struts2的MethodFilterInterceptor拦截器,并override其中的doIntercept方法,完成对未登录用户进行拦截和重定向的操作。
- 我们把ActionContext中的Session取得,在Session中获取标识登录用户的信息。
- 检查Session是否包含key为"loginUser"的信息,如果有则表示用户已经登录,允许请求进入Action进行操作;如果没有,则表示用户没有登录,不允许我们继续操作,需要重定向到登录页面。
- 我们在此例中添加了对登录和注册Action的允许,避免对这些Action不必要的拦截。
总结
运用Struts2的拦截器功能,我们可以实现非常方便的拦截未登录用户,在进行会员操作时特别有用。通过Custom struts2 interceptor实现用户登录验证,无需在每个Action中写判断逻辑,充分体现了封装、抽象、继承等面向对象编程思想。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts拦截器实现拦截未登陆用户实例解析 - Python技术站