作用:拦截Action调用的对象
与过滤器区别:
过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。
1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。
使用方法:
一、拦截器配置。
第一步:创建一个类,让其继承自AbstractInterceptor
package maya.util; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor {//类名: MyInterceptor @Override public String intercept(ActionInvocation arg0) throws Exception { return arg0.invoke(); } }
第二步:配置struts.xml
1.添加<interceptors>配置节,添加拦截器配置。
2.在action中引用,<interceptors>中的配置。
<package name="default" namespace="/" extends="struts-default"> <!--拦截器配置节--> <interceptors> <interceptor name="myinterceptor" class="maya.util.MyInterceptor"></interceptor> <interceptor-stack name="newStack"><!--在建<interceptors>可以建立stack,把defaultStack也添加在里面,在引用的时候引用此stack即可。--> <interceptor-ref name="myinterceptor"></interceptor-ref><!----> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="*_*" class="maya.controller.{1}Action" method="{2}"> <!--在action中需要添加defaultStack引用,上文建立的stack包含defaultStack,引用建立的newStack即可 --> <interceptor-ref name="newStack"></interceptor-ref> <result> {1}/{2}.jsp </result> </action> </package>
注意:
1.在action中需要添加defaultStack引用
2.在建<interceptors>可以建立stack,把defaultStack也添加在里面,在引用的时候引用此stack即可。
二、在拦截器中使用内置对象。
1.ActionContext 获取Map.
2.ServletActionContext 获取HttpSession
3.实现SessionAware接口
实例:使用拦截器实现登录身份验证。
思路:有两个action不能拦截。打回登录界面action和登录提交验证并写 session的action
在登录验证的auth方法中,分两种情况:
1.第一次登录验证。此时,session中没有信息,需要向session中添加登录信息
2.非第一次登录验证。此时,session中有信息,不需要再入session中添加信息
User.java
package maya.model; public class User { 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; } }
拦截器AuthInterceptor.java
package maya.util; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class AuthInterceptor extends AbstractInterceptor { private Map<String, Object> session; @Override public String intercept(ActionInvocation arg0) throws Exception { session = ActionContext.getContext().getSession(); if (session.get("user") == null) { //没有登录,打回登录界面 return "nologin"; } return arg0.invoke(); } }
LoginAction.java
package maya.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import maya.model.User; public class LoginAction extends ActionSupport implements ModelDriven<User>,SessionAware{ private Map<String, Object> session = new HashMap<String,Object>(); private User user = new User(); public String login() { //打登录界面 return SUCCESS; } public String auth() { //模拟数据库访问验证 List<String> uid = new ArrayList<String>(); uid.add("zhangsan"); uid.add("lisi"); //如果正确 Object obj = session.get("user"); if (obj == null) {//session中没有此数据,第一次登录的验证 if (uid.contains(user.getUserName())) {//相当于到数据库进行用户名和密码的判断 session.put("user", user.getUserName()); return SUCCESS; } else { return "nologin"; } } else { return SUCCESS; } } @Override public void setSession(Map<String, Object> arg0) { // TODO 自动生成的方法存根 this.session = arg0; } @Override public User getModel() { // TODO 自动生成的方法存根 return user; } }
struts.xml配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="authinterceptor" class="maya.util.AuthInterceptor"></interceptor> <interceptor-stack name="newStack"> <interceptor-ref name="authinterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!--有很多时候一个<result>可供很多<action>使用,这时可以使用<global-results>标签来定义全局的<result>。执行顺序:当一个Action返回的String没有相应的<result>与之对应,Struts2就会查找全局的<result>。--> <global-results> <result name="nologin">/Login/login.jsp</result> </global-results> <action name="Login_login" class="maya.controller.LoginAction" method="login"> <result>/Login/login.jsp</result><!--路径为WebContent/Login/login.jsp,上下文<result>同理--> </action> <action name="Login_auth" class="maya.controller.LoginAction" method="auth"> <result>/Login/auth.jsp</result> </action> </package> </struts>
login.jsp和auth.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>登陆</h1> <form action="Login_auth"> 账号:<input type="text" name="userName"><br> 密码:<input type="text" name="password"><br> <input type="submit" value="登陆"> </form> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>登录信息</h1> username:---<s:property value="userName"/><br> password:---<s:property value="password"/><br> <s:debug></s:debug> </body> </html>
运行结果: