Struts2种的Interceptor类似于以往我们知道的过滤器,对用户的请求进行过滤处理,根据过滤得情况决定下一步需要采取的操作。
也可以理解成对用户的请求进行拦截处理。而且可以将多个拦截器合在一起使用,进行多种工作的拦截处理。
同样可以理解成Spring中的AOP,对一些操作进行额外的处理(比如前置处理、后置处理等)
Struts2种预定义了多种拦截器,比如Timer拦截器负责处理Action的运行时间,Log拦截器负责进行日志记录。在这里不对预定义的拦截器进行讲解。
我们同样可以定义我们自己的拦截器,对某些操作进行通用的处理。比如通用的验证处理。当我们请求某些操作的时候需要事先已经进行了验证,否则不允许请求这些操作,如果进行了验证,则允许。那么我们就可以自定义一个验证的拦截器,对需要进行验证的操作进行拦截。
好了,下面通过一个简单的实例进行讲解。
创建一个web project,比如这里是MySampleWeb,当然需要加入Struts所需要的类库(.jar)
首先创建拦截器类LoginInterceptor,需要继承AbstractInterceptor,这样,我们
就建立了一个我们自定义的拦截器。拦截器中存在一个名称为intercept的方法,这个方法即为拦截方法,这个方法为契约方法,当拦截器运行的时候,此
方法负责处理拦截,我们的拦截代码写在其中。
因为此拦截器负责判断是否验证的拦截,具体的代码如下:
package com.frank.interceptor;
import java.util.Map;
import com.frank.action.UserAware;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation ai) throws Exception {
Map session=ai.getInvocationContext().getSession();//得到当前的session
String username=(String)session.get("username");//取得当前session中的username属性
if(username!=null){//如果存在代表已经登录过
Object user=ai.getAction();
if(user instanceof UserAware){//如果此Action需要username属性值,则将值记录到Action中
UserAware action=(UserAware)user;
action.setUsername(username);
}
return ai.invoke();//正常执行此Action
}else{
return Action.LOGIN;//没有登录过,则转发到登录页面
}
}
}
下面建立UserAware接口,注意实现此接口的Action代表需要username的内容,此接口只有一个设置username的方法
package com.frank.action;
public interface UserAware {
public void setUsername(String username);
}
下面建立需要被拦截的Action,在这里建立一个名称为ShowUserAction,此Action需要记录username,所以额外需要实现UserAware接口,代码如下:
package com.frank.action;
import com.opensymphony.xwork2.ActionSupport;
public class ShowUserAction extends ActionSupport implements UserAware {
private String username;
public void setUsername(String username) {
this.username=username;
}
public String getUsername() {
return username;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
此Action非常的简单,而且契约方法execute只是简单的返回SUCCESS,注意此Action需要记录username,以便转发到jsp时,可以将username的内容传出,由相应的jsp使用
好了,现在建立登录Action,以便处理登录的请求,名称为LoginAction,和其他的登录Action一
样,负责进行登录验证工作,验证工作交给javabean去做(可以按照自己的需要进行实际的验证处理),因为验证成功后需要将username保存到
session中,所以在此Action实现SessionAware接口以便使用session。session为Map类型,所以声明一个Map类型
的成员session,并实现setSession方法得到session,代码如下:
package com.frank.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.frank.rule.UserBean;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport implements SessionAware {
private Map session;
private String username;
private String password;
public void setSession(Map session) {
this.session=session;
}
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;
}
@Override
public String execute() throws Exception {
UserBean userBean=new UserBean();
userBean.setUsername(username);
userBean.setPassword(password);
if(userBean.checkUser()){
session.put("username", username);
return SUCCESS;
}else{
return INPUT;
}
}
}
建立UserBean,进行实际的验证工作,在此,如果输入的用户名为admin、guest、frank任意一个都为正确,忽略密码。实际的验证工作可以自己定义
package com.frank.rule;
public class UserBean {
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;
}
public boolean checkUser(){
if(this.username.equals("admin")||this.username.equals("guest")||this.username.equals("frank")){
return true;
}
return false;
}
}
创建登录页面login.jsp,非常的简单:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>User Login</h1>
<form action="login.action">
<s:textfield name="username" label="Username:"/><br>
<s:password name="password" label="Password:"/><br>
<s:submit/>
</form>
</body>
</html>
建立显示用户信息的页面showUsername.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'showUsername.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>The Username:<s:property value="username"/></h1>
</body>
</html>
好了现在进行必须的配置工作,首先配置web.xml,以便可以使用struts2,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
strtus.xml配置文件如下,注意拦截器的配置,拦截器负责拦截ShowUserAction
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
<include file="struts-default.xml"/>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="loginInteceptor" class="com.frank.interceptor.LoginInterceptor"/>
</interceptors>
<action name="login" class="com.frank.action.LoginAction">
<result type="chain">showUserAction</result>
</action>
<action name="showUserAction" class="com.frank.action.ShowUserAction">
<interceptor-ref name="loginInteceptor"/>
<result name="login">login.jsp</result>
<result>showUsername.jsp</result>
</action>
</package>
</struts>
部署运行
请求showUserAction,拦截器拦截,因为开始时候没有登录,所以转发到login.jsp页面,如下图:
用正确的密码登录,显示如下:
如果此时在此请求showUserAction,则不需要登录,因为已经登录过了
- 大小: 16.4 KB
- 大小: 19.3 KB
- 大小: 18.1 KB
分享到:
相关推荐
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
在Struts2框架中,**Interceptor(拦截器)**是一个关键组件,它允许开发者在特定的动作(Action)执行前后添加自定义的处理逻辑,极大地增强了应用程序的灵活性。 #### 二、Interceptor 概念与作用 Interceptor ...
在Struts2框架中,拦截器(Interceptor)是一种非常重要的机制,它能够帮助开发者实现诸如权限控制、事务管理、日志记录等跨切关注点的功能。通过定义不同的拦截器栈,可以灵活地组合各种功能,从而达到复用代码的...
在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...
STRUTS2:拦截器Interceptor
- XML配置:在`struts.xml`文件中,使用`<interceptor>`元素定义拦截器,`<interceptor-stack>`元素组合多个拦截器,`<package>`元素下的`interceptors`属性指定拦截器栈。 ```xml <interceptor name=...
在`struts.xml`配置文件中,可以使用`<interceptors>`标签定义拦截器栈,然后使用`<interceptor>`标签定义具体的拦截器。例如,以下配置创建了一个包含日志拦截器和权限检查拦截器的拦截器栈: ```xml ...
这篇博客文章“struts2 拦截器的使用(继承抽象拦截器)”探讨了如何通过继承Struts2的抽象拦截器来创建自定义拦截器。 首先,让我们理解拦截器的基本概念。在Struts2中,拦截器是基于Java的动态代理机制实现的,...
在Struts2的配置文件(struts.xml)中,我们需要设置Struts2使用Spring插件,并指定Spring的配置文件位置: ```xml <constant name="struts.objectFactory" value="org.springframework.web.struts2....
3. **配置拦截器**:拦截器可以通过Struts2配置文件或注解进行配置,指定在哪些Action上使用哪些拦截器。 ### 二、单个Action配置拦截器实例 1. **创建拦截器**:首先,我们需要创建一个实现了`Interceptor`接口的...
Struts2框架中的拦截器(Interceptor)是一种重要的机制,用于在Action执行前后进行一系列处理,比如参数验证、数据预处理等。它能够帮助开发者更加灵活地控制程序流程,提高代码的复用性。 #### 二、Struts2拦截器...
struts2 拦截器_教程.zip
Struts2 工作原理及拦截器和过滤器 Struts2 框架的工作原理可以分为以下几个步骤: 1. 客户端发出一个指向 Servlet 容器的请求(Tomcat); 2. 这个请求会经过几个过滤器,最后会到达 FilterDispatcher 过滤器。...
2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...
Struts2是一个强大的MVC框架,它通过使用拦截器(Interceptor)来实现业务逻辑与表现层的解耦,提供了一种灵活的扩展机制。在Struts2中,拦截器是AOP(面向切面编程)的一种实现,它可以监控、修改或增强方法调用的...
- **拦截器的核心功能**:Struts2拦截器可以动态地拦截发送到指定Action的请求,并在Action执行前后插入自定义的逻辑处理。 - **代码重用原则**:通过拦截器机制,可以将多个Action中需要重复指定的代码提取出来,...
在Struts2中,拦截器是实现业务逻辑控制和增强功能的重要机制,它们扮演着类似于AOP(面向切面编程)的角色,允许在动作执行前后插入自定义逻辑。在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何...
在Struts2中,拦截器(Interceptor)是核心功能之一,用于增强应用的功能和处理业务逻辑。拦截器是基于AOP(面向切面编程)的概念,可以在动作执行前后插入额外的操作,比如日志记录、权限检查、数据验证等。 标题...