-
package com.opensymphony.xwork2.interceptor;
-
import com.opensymphony.xwork2.ActionInvocation;
-
import java.io.Serializable;
-
public
interface Interceptor extends Serializable {
-
void destroy();
-
void init();
-
String intercept(ActionInvocation invocation) throws Exception;
-
}
- void init():该方法在拦截器被创建后会立即被调用,它在拦截器的生命周期内只被调用一次,可以在该方法中对相关资源进行必要的初始化。
- void destroy():该方法与init方法相对应,在拦截器实例被销毁之前,将调用该方法来释放和拦截器相关的资源。它在拦截器的生命周期内,也只被调用一次。
- String intercept(Actionlnvocation invocation) throws Exception:该方法是拦截器的核心方法,用来添加真正执行拦截工作的代码,实现具体的拦截操作。它返回一个字符串作为逻辑视图,系统根据返回的字符串跳转到对应的视图资源。每拦截一个动作请求,该方法就会被调用一次。该方法的ActionInvocation参数包含了被拦截的Action的引用,可以通过该参 数的invoke()方法,将控制权转给下一个拦截器或者转给Action的execute()方法。
-
// 放行前执行拦截操作
-
String invoke = invocation.invoke();
-
// 返回视图后拦截操作
-
return invoke;
-
package com.opensymphony.xwork2.interceptor;
-
import com.opensymphony.xwork2.ActionInvocation;
-
public
abstract
class AbstractInterceptor implements Interceptor {
-
public void init() {}
-
public void destroy() {}
-
public abstract String intercept(ActionInvocation invocation) throws Exception;
-
}
- 第一步:定义一个拦截器类
- 第二步:配置拦截器
-
- 声明拦截器
-
<interceptors>
-
<interceptor name="指定一个名称" class="全类名"/>
-
</interceptors>
-
- 引用拦截器
<interceptor-ref name="引用指定的名称"/>
- 如何放行
- 拦截器的执行
- 放行方法的返回值
在放行之前,拦截器的返回值可以控制显示哪个结果视图.一旦放行之后,它一定会显示动作方法返回值所匹配的结果视图,此时不管拦截器返回什么内容
* 比如执行这个Action
* public String Demo1(){
name = “123”;
return SUCCESS;
}
而拦截器如下:
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println(“拦截器起作用了”);
//拦截器放行了
String iv = invocation.invoke();
System.out.println(“拦截器放行了”);
//放行
return “error”;
}
那么它会跳转到哪个页面呢?因为在拦截器中先放行,再return,所以会跳转到success.jsp中,而不是error.jsp
为什么会这样?在执行invocation.invoke()时,会把success页面的内容存到缓存中,return时,直接从缓存显示出来
- 多个拦截器的执行顺序问题
-
<interceptors>
-
<!-- 定义一个拦截器栈:包含权限拦截器和默认拦截器栈 -->
-
<interceptor-stack name="myDefaultStack">
-
<interceptor-ref name="privilegeInterceptor1"/>
-
<interceptor-ref name="defaultStack"/>
-
</interceptor-stack>
-
</interceptors>
-
<package name="struts-default" abstract="true">
-
........
-
<interceptors>
-
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
-
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
-
<interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
-
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
-
<interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
-
<interceptor name="cookieProvider" class="org.apache.struts2.interceptor.CookieProviderInterceptor"/>
-
<interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
-
<interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
-
<interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
-
<interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
-
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
-
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
-
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
-
<interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
-
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
-
<interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
-
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
-
<interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
-
<interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
-
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
-
<interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
-
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
-
<interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
-
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
-
<interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
-
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
-
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
-
<interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
-
<interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
-
<interceptor name="datetime" class="org.apache.struts2.interceptor.DateTextFieldInterceptor" />
-
<interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
-
<interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
-
<interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
-
<interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
-
<interceptor name="deprecation" class="org.apache.struts2.interceptor.DeprecationInterceptor" />
-
-
<!-- Basic stack -->
-
<interceptor-stack name="basicStack">
-
<interceptor-ref name="exception"/>
-
<interceptor-ref name="servletConfig"/>
-
<interceptor-ref name="prepare"/>
-
<interceptor-ref name="checkbox"/>
-
<interceptor-ref name="datetime"/>
-
<interceptor-ref name="multiselect"/>
-
<interceptor-ref name="actionMappingParams"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="conversionError"/>
-
<interceptor-ref name="deprecation"/>
-
</interceptor-stack>
-
-
<!-- Sample validation and workflow stack -->
-
<interceptor-stack name="validationWorkflowStack">
-
<interceptor-ref name="basicStack"/>
-
<interceptor-ref name="validation"/>
-
<interceptor-ref name="workflow"/>
-
</interceptor-stack>
-
-
<!-- Sample file upload stack -->
-
<interceptor-stack name="fileUploadStack">
-
<interceptor-ref name="fileUpload"/>
-
<interceptor-ref name="basicStack"/>
-
</interceptor-stack>
-
-
<!-- Sample model-driven stack -->
-
<interceptor-stack name="modelDrivenStack">
-
<interceptor-ref name="modelDriven"/>
-
<interceptor-ref name="basicStack"/>
-
</interceptor-stack>
-
-
<!-- Sample action chaining stack -->
-
<interceptor-stack name="chainStack">
-
<interceptor-ref name="chain"/>
-
<interceptor-ref name="basicStack"/>
-
</interceptor-stack>
-
-
<!-- Sample i18n stack -->
-
<interceptor-stack name="i18nStack">
-
<interceptor-ref name="i18n"/>
-
<interceptor-ref name="basicStack"/>
-
</interceptor-stack>
-
-
<!-- An example of the paramsPrepareParams trick. This stack
-
is exactly the same as the defaultStack, except that it
-
includes one extra interceptor before the prepare interceptor:
-
the params interceptor.
-
-
This is useful for when you wish to apply parameters directly
-
to an object that you wish to load externally (such as a DAO
-
or database or service layer), but can't load that object
-
until at least the ID parameter has been loaded. By loading
-
the parameters twice, you can retrieve the object in the
-
prepare() method, allowing the second params interceptor to
-
apply the values on the object. -->
-
<interceptor-stack name="paramsPrepareParamsStack">
-
<interceptor-ref name="exception"/>
-
<interceptor-ref name="alias"/>
-
<interceptor-ref name="i18n"/>
-
<interceptor-ref name="checkbox"/>
-
<interceptor-ref name="datetime"/>
-
<interceptor-ref name="multiselect"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="servletConfig"/>
-
<interceptor-ref name="prepare"/>
-
<interceptor-ref name="chain"/>
-
<interceptor-ref name="modelDriven"/>
-
<interceptor-ref name="fileUpload"/>
-
<interceptor-ref name="staticParams"/>
-
<interceptor-ref name="actionMappingParams"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="conversionError"/>
-
<interceptor-ref name="validation">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="workflow">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
</interceptor-stack>
-
-
<!-- A complete stack with all the common interceptors in place.
-
Generally, this stack should be the one you use, though it
-
may do more than you need. Also, the ordering can be
-
switched around (ex: if you wish to have your servlet-related
-
objects applied before prepare() is called, you'd need to move
-
servletConfig interceptor up.
-
-
This stack also excludes from the normal validation and workflow
-
the method names input, back, and cancel. These typically are
-
associated with requests that should not be validated.
-
-->
-
<interceptor-stack name="defaultStack">
-
<interceptor-ref name="exception"/>
-
<interceptor-ref name="alias"/>
-
<interceptor-ref name="servletConfig"/>
-
<interceptor-ref name="i18n"/>
-
<interceptor-ref name="prepare"/>
-
<interceptor-ref name="chain"/>
-
<interceptor-ref name="scopedModelDriven"/>
-
<interceptor-ref name="modelDriven"/>
-
<interceptor-ref name="fileUpload"/>
-
<interceptor-ref name="checkbox"/>
-
<interceptor-ref name="datetime"/>
-
<interceptor-ref name="multiselect"/>
-
<interceptor-ref name="staticParams"/>
-
<interceptor-ref name="actionMappingParams"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="conversionError"/>
-
<interceptor-ref name="validation">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="workflow">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="debugging"/>
-
<interceptor-ref name="deprecation"/>
-
</interceptor-stack>
-
-
<!-- The completeStack is here for backwards compatibility for
-
applications that still refer to the defaultStack by the
-
old name -->
-
<interceptor-stack name="completeStack">
-
<interceptor-ref name="defaultStack"/>
-
</interceptor-stack>
-
-
<!-- Sample execute and wait stack.
-
Note: execAndWait should always be the
last interceptor. -->
-
<interceptor-stack name="executeAndWaitStack">
-
<interceptor-ref name="execAndWait">
-
<param name="excludeMethods">input,back,cancel
</param>
-
</interceptor-ref>
-
<interceptor-ref name="defaultStack"/>
-
<interceptor-ref name="execAndWait">
-
<param name="excludeMethods">input,back,cancel
</param>
-
</interceptor-ref>
-
</interceptor-stack>
-
-
</interceptors>
-
-
<default-interceptor-ref name="defaultStack"/>
-
-
......
-
</package>
-
<package name="struts-default" abstract="true">
-
<interceptors>
-
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
-
......
-
<interceptor-stack name="defaultStack">
-
<interceptor-ref name="exception"/>
-
<interceptor-ref name="alias"/>
-
<interceptor-ref name="servletConfig"/>
-
<interceptor-ref name="i18n"/>
-
<interceptor-ref name="prepare"/>
-
<interceptor-ref name="chain"/>
-
<interceptor-ref name="scopedModelDriven"/>
-
<interceptor-ref name="modelDriven"/>
-
<interceptor-ref name="fileUpload"/>
-
<interceptor-ref name="checkbox"/>
-
<interceptor-ref name="datetime"/>
-
<interceptor-ref name="multiselect"/>
-
<interceptor-ref name="staticParams"/>
-
<interceptor-ref name="actionMappingParams"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="conversionError"/>
-
<interceptor-ref name="validation">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="workflow">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="debugging"/>
-
<interceptor-ref name="deprecation"/>
-
</interceptor-stack>
-
</interceptors>
-
<default-interceptor-ref name="defaultStack"/>
-
</package>
-
package com.pc.user.web.action;
-
import com.opensymphony.xwork2.ActionSupport;
-
/
-
* 用户Action
-
-
@author Switch
-
* @data 2016年11月20日
-
* @version V1.0
-
/
-
public
class UserAction extends ActionSupport {
-
private
static
final
long serialVersionUID =
366851530423407749L;
-
/
-
模拟保存用户
-
* @return
-
/
-
public String saveUser() {
-
System.out.println(
"保存成功");
-
return SUCCESS;
-
}
-
-
/
-
模拟删除用户
-
-
@return
-
/
-
public String removeUser() {
-
System.out.println(
"删除成功");
-
return SUCCESS;
-
}
-
}
-
package com.pc.user.web.interceptor;
-
import com.opensymphony.xwork2.ActionInvocation;
-
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
-
/
-
拦截器1
-
-
@author Switch
-
* @data 2016年11月20日
-
* @version V1.0
-
*/
-
public
class MyInterceptor1 extends AbstractInterceptor {
-
private
static
final
long serialVersionUID = -
623800184006159480L;
-
-
@Override
-
public String intercept(ActionInvocation invocation) throws Exception {
-
System.out.println(
"访问Action前,MyInterceptor1拦截了");
-
// //放行:如果有下一个拦截器执行下一个拦截器,如果该拦截器是最后一个,则执行动作方法。
-
String invoke = invocation.invoke();
-
System.out.println(
"访问Action后,MyInterceptor1拦截了");
-
-
return invoke;
-
}
-
}
-
<?xml version="1.0" encoding="UTF-8"?>
-
<!DOCTYPE struts PUBLIC
-
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
-
-
<struts>
-
<constant name="struts.devMode" value="true"/>
-
-
<!-- 定义一些公共的配置:针对当前web工程的 -->
-
<package name="myDefaultPackage" extends="struts-default" abstract="true">
-
<interceptors>
-
<!-- 声明拦截器 -->
-
<interceptor name="myInterceptor1" class="com.pc.user.web.interceptor.MyInterceptor1"/>
-
</interceptors>
-
</package>
-
-
<package name="pack1" extends="myDefaultPackage" namespace="">
-
-
<global-results>
-
<result name="success" type="dispatcher">/success.jsp
</result>
-
</global-results>
-
-
<!-- 用户保存 -->
-
<action name="saveUser" class="com.pc.user.web.action.UserAction" method="saveUser">
-
<!-- 使用拦截器 -->
-
<interceptor-ref name="myInterceptor1">
</interceptor-ref>
-
<result name="main" type="dispatcher">/main.jsp
</result>
-
</action>
-
-
<!-- 用户删除 -->
-
<action name="removeUser" class="com.pc.user.web.action.UserAction" method="removeUser"/>
-
-
</package>
-
</struts>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>主页
</title>
-
</head>
-
<body>
-
<a href="${pageContext.request.contextPath}/saveUser.action"</span>></span>用户保存<span class="hljs-tag"></<span class="hljs-name">a</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"${pageContext.request.contextPath}/removeUser.action">用户删除
</a>
-
</body>
-
</html>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>成功
</title>
-
</head>
-
<body>
-
<h2>执行成功
</h2>
-
<% System.out.println("执行成功"); %>
-
</body>
-
</html>
访问Action前,MyInterceptor1拦截了
保存成功
执行成功
访问Action后,MyInterceptor1拦截了
删除成功
执行成功
-
package com.opensymphony.xwork2.interceptor;
-
import com.opensymphony.xwork2.ActionInvocation;
-
import com.opensymphony.xwork2.util.TextParseUtil;
-
import com.opensymphony.xwork2.util.logging.Logger;
-
import com.opensymphony.xwork2.util.logging.LoggerFactory;
-
-
import java.util.Collections;
-
import java.util.Set;
-
public
abstract
class MethodFilterInterceptor extends AbstractInterceptor {
-
protected
transient Logger log = LoggerFactory.getLogger(getClass());
-
-
protected Set<String> excludeMethods = Collections.emptySet();
-
protected Set<String> includeMethods = Collections.emptySet();
-
-
public void setExcludeMethods(String excludeMethods) {
-
this.excludeMethods = TextParseUtil.commaDelimitedStringToSet(excludeMethods);
-
}
-
-
public Set<String> getExcludeMethodsSet() {
-
return excludeMethods;
-
}
-
-
public void setIncludeMethods(String includeMethods) {
-
this.includeMethods = TextParseUtil.commaDelimitedStringToSet(includeMethods);
-
}
-
-
public Set<String> getIncludeMethodsSet() {
-
return includeMethods;
-
}
-
-
@Override
-
public String intercept(ActionInvocation invocation) throws Exception {
-
if (applyInterceptor(invocation)) {
-
return doIntercept(invocation);
-
}
-
return invocation.invoke();
-
}
-
-
protected boolean applyInterceptor(ActionInvocation invocation) {
-
String method = invocation.getProxy().getMethod();
-
// ValidationInterceptor
-
boolean applyMethod = MethodFilterInterceptorUtil.applyMethod(excludeMethods, includeMethods, method);
-
if (log.isDebugEnabled()) {
-
if (!applyMethod) {
-
log.debug(
"Skipping Interceptor... Method [" + method +
"] found in exclude list.");
-
}
-
}
-
return applyMethod;
-
}
-
-
protected abstract String doIntercept(ActionInvocation invocation) throws Exception;
-
}
-
package com.pc.user.web.action;
-
-
import com.opensymphony.xwork2.ActionContext;
-
import com.opensymphony.xwork2.ActionSupport;
-
-
/
-
* 用户Action
-
-
@author Switch
-
* @data 2016年11月20日
-
* @version V1.0
-
/
-
public
class UserAction extends ActionSupport {
-
private
static
final
long serialVersionUID =
366851530423407749L;
-
-
/
-
模拟登陆
-
-
@return
-
/
-
public String login() {
-
ActionContext.getContext().getSession().put(
"loginUser",
"switch");
-
System.out.println(
"登陆成功");
-
return
"main";
-
}
-
-
/
-
模拟保存用户
-
-
@return
-
/
-
public String saveUser() {
-
System.out.println(
"保存成功");
-
return SUCCESS;
-
}
-
-
/
-
模拟删除用户
-
-
@return
-
/
-
public String removeUser() {
-
System.out.println(
"删除成功");
-
return SUCCESS;
-
}
-
}
-
package com.pc.user.web.interceptor;
-
import com.opensymphony.xwork2.ActionContext;
-
import com.opensymphony.xwork2.ActionInvocation;
-
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
-
/*
-
* 权限过滤器,实现登录验证
-
* 通过实现方法过滤拦截器实现
-
-
@author Switch
-
* @data 2016年11月20日
-
* @version V1.0
-
*/
-
public
class PrivilegeInterceptor extends MethodFilterInterceptor {
-
private
static
final
long serialVersionUID = -
623800184006159480L;
-
-
@Override
-
protected String doIntercept(ActionInvocation invocation) throws Exception {
-
// 判断session中是否有用户数据
-
ActionContext context = ActionContext.getContext();
-
Object loginUser = context.getSession().get(
"loginUser");
-
// 用户不存在,则返回登录界面
-
if (loginUser ==
null) {
-
return
"login";
-
}
-
// 放行
-
return invocation.invoke();
-
}
-
}
-
<?xml version="1.0" encoding="UTF-8"?>
-
<!DOCTYPE struts PUBLIC
-
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
-
-
<struts>
-
<constant name="struts.devMode" value="true"/>
-
-
<!-- 定义一些公共的配置:针对当前web工程的 -->
-
<package name="myDefaultPackage" extends="struts-default" abstract="true">
-
<interceptors>
-
<!-- 声明权限拦截器 -->
-
<interceptor name="privilegeInterceptor1" class="com.pc.user.web.interceptor.PrivilegeInterceptor"/>
-
<!-- 定义一个拦截器栈:包含权限拦截器和默认拦截器栈 -->
-
<interceptor-stack name="myDefaultStack">
-
<interceptor-ref name="privilegeInterceptor1">
-
<!-- 给拦截器注入参数:告知拦截器拦截哪些或者是排除哪些方法。挑少的写
-
传入参数的name是找MethodFilterInterceptor中setXXXX方法后面的部分。
-
传入参数的值写的是动作方法名称,如果是多个方法,以逗号分隔。
-
<param name="excludeMethods">login</param> -->
-
</interceptor-ref>
-
<interceptor-ref name="defaultStack"/>
-
</interceptor-stack>
-
</interceptors>
-
-
<!-- 定义默认拦截器栈:把myDefaultStack声明为默认拦截器栈 -->
-
<default-interceptor-ref name="myDefaultStack" />
-
</package>
-
-
<package name="pack1" extends="myDefaultPackage" namespace="">
-
<!-- 全局结果视图 -->
-
<global-results>
-
<result name="success" type="dispatcher">/success.jsp
</result>
-
<result name="login" type="redirect">/login.jsp
</result>
-
</global-results>
-
-
-
<!-- 用户登录 -->
-
<action name="login" class="com.pc.user.web.action.UserAction" method="login">
-
<!-- 转发到主页 -->
-
<result name="main" type="dispatcher">/main.jsp
</result>
-
<interceptor-ref name="myDefaultStack">
-
<!-- 指定给过滤器栈中哪个过滤器设置参数 -->
-
<param name="privilegeInterceptor1.excludeMethods">login
</param>
-
</interceptor-ref>
-
</action>
-
-
<!-- 用户保存 -->
-
<action name="saveUser" class="com.pc.user.web.action.UserAction" method="saveUser"/>
-
-
<!-- 用户删除 -->
-
<action name="removeUser" class="com.pc.user.web.action.UserAction" method="removeUser"/>
-
-
</package>
-
</struts>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>登录页
</title>
-
</head>
-
<body>
-
<a href="${pageContext.request.contextPath}/login.action">用户登录
</a>
-
</body>
-
</html>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>主页
</title>
-
</head>
-
<body>
-
<a href="${pageContext.request.contextPath}/saveUser.action"</span>></span>用户保存<span class="hljs-tag"></<span class="hljs-name">a</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"${pageContext.request.contextPath}/removeUser.action">用户删除
</a>
-
</body>
-
</html>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>成功
</title>
-
</head>
-
<body>
-
<h2>执行成功
</h2>
-
<% System.out.println("执行成功"); %>
-
</body>
-
</html>
-
package com.opensymphony.xwork2.interceptor;
-
import com.opensymphony.xwork2.ActionInvocation;
-
import java.io.Serializable;
-
public
interface Interceptor extends Serializable {
-
void destroy();
-
void init();
-
String intercept(ActionInvocation invocation) throws Exception;
-
}
- void init():该方法在拦截器被创建后会立即被调用,它在拦截器的生命周期内只被调用一次,可以在该方法中对相关资源进行必要的初始化。
- void destroy():该方法与init方法相对应,在拦截器实例被销毁之前,将调用该方法来释放和拦截器相关的资源。它在拦截器的生命周期内,也只被调用一次。
- String intercept(Actionlnvocation invocation) throws Exception:该方法是拦截器的核心方法,用来添加真正执行拦截工作的代码,实现具体的拦截操作。它返回一个字符串作为逻辑视图,系统根据返回的字符串跳转到对应的视图资源。每拦截一个动作请求,该方法就会被调用一次。该方法的ActionInvocation参数包含了被拦截的Action的引用,可以通过该参 数的invoke()方法,将控制权转给下一个拦截器或者转给Action的execute()方法。
-
// 放行前执行拦截操作
-
String invoke = invocation.invoke();
-
// 返回视图后拦截操作
-
return invoke;
-
package com.opensymphony.xwork2.interceptor;
-
import com.opensymphony.xwork2.ActionInvocation;
-
public
abstract
class AbstractInterceptor implements Interceptor {
-
public void init() {}
-
public void destroy() {}
-
public abstract String intercept(ActionInvocation invocation) throws Exception;
-
}
- 第一步:定义一个拦截器类
- 第二步:配置拦截器
-
- 声明拦截器
-
<interceptors>
-
<interceptor name="指定一个名称" class="全类名"/>
-
</interceptors>
-
- 引用拦截器
<interceptor-ref name="引用指定的名称"/>
- 如何放行
- 拦截器的执行
- 放行方法的返回值
在放行之前,拦截器的返回值可以控制显示哪个结果视图.一旦放行之后,它一定会显示动作方法返回值所匹配的结果视图,此时不管拦截器返回什么内容
* 比如执行这个Action
* public String Demo1(){
name = “123”;
return SUCCESS;
}
而拦截器如下:
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println(“拦截器起作用了”);
//拦截器放行了
String iv = invocation.invoke();
System.out.println(“拦截器放行了”);
//放行
return “error”;
}
那么它会跳转到哪个页面呢?因为在拦截器中先放行,再return,所以会跳转到success.jsp中,而不是error.jsp
为什么会这样?在执行invocation.invoke()时,会把success页面的内容存到缓存中,return时,直接从缓存显示出来
- 多个拦截器的执行顺序问题
-
<interceptors>
-
<!-- 定义一个拦截器栈:包含权限拦截器和默认拦截器栈 -->
-
<interceptor-stack name="myDefaultStack">
-
<interceptor-ref name="privilegeInterceptor1"/>
-
<interceptor-ref name="defaultStack"/>
-
</interceptor-stack>
-
</interceptors>
-
<package name="struts-default" abstract="true">
-
........
-
<interceptors>
-
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
-
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
-
<interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
-
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
-
<interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
-
<interceptor name="cookieProvider" class="org.apache.struts2.interceptor.CookieProviderInterceptor"/>
-
<interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
-
<interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
-
<interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
-
<interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
-
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
-
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
-
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
-
<interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
-
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
-
<interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
-
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
-
<interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
-
<interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
-
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
-
<interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
-
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
-
<interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
-
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
-
<interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
-
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
-
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
-
<interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
-
<interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
-
<interceptor name="datetime" class="org.apache.struts2.interceptor.DateTextFieldInterceptor" />
-
<interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
-
<interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
-
<interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
-
<interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
-
<interceptor name="deprecation" class="org.apache.struts2.interceptor.DeprecationInterceptor" />
-
-
<!-- Basic stack -->
-
<interceptor-stack name="basicStack">
-
<interceptor-ref name="exception"/>
-
<interceptor-ref name="servletConfig"/>
-
<interceptor-ref name="prepare"/>
-
<interceptor-ref name="checkbox"/>
-
<interceptor-ref name="datetime"/>
-
<interceptor-ref name="multiselect"/>
-
<interceptor-ref name="actionMappingParams"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="conversionError"/>
-
<interceptor-ref name="deprecation"/>
-
</interceptor-stack>
-
-
<!-- Sample validation and workflow stack -->
-
<interceptor-stack name="validationWorkflowStack">
-
<interceptor-ref name="basicStack"/>
-
<interceptor-ref name="validation"/>
-
<interceptor-ref name="workflow"/>
-
</interceptor-stack>
-
-
<!-- Sample file upload stack -->
-
<interceptor-stack name="fileUploadStack">
-
<interceptor-ref name="fileUpload"/>
-
<interceptor-ref name="basicStack"/>
-
</interceptor-stack>
-
-
<!-- Sample model-driven stack -->
-
<interceptor-stack name="modelDrivenStack">
-
<interceptor-ref name="modelDriven"/>
-
<interceptor-ref name="basicStack"/>
-
</interceptor-stack>
-
-
<!-- Sample action chaining stack -->
-
<interceptor-stack name="chainStack">
-
<interceptor-ref name="chain"/>
-
<interceptor-ref name="basicStack"/>
-
</interceptor-stack>
-
-
<!-- Sample i18n stack -->
-
<interceptor-stack name="i18nStack">
-
<interceptor-ref name="i18n"/>
-
<interceptor-ref name="basicStack"/>
-
</interceptor-stack>
-
-
<!-- An example of the paramsPrepareParams trick. This stack
-
is exactly the same as the defaultStack, except that it
-
includes one extra interceptor before the prepare interceptor:
-
the params interceptor.
-
-
This is useful for when you wish to apply parameters directly
-
to an object that you wish to load externally (such as a DAO
-
or database or service layer), but can't load that object
-
until at least the ID parameter has been loaded. By loading
-
the parameters twice, you can retrieve the object in the
-
prepare() method, allowing the second params interceptor to
-
apply the values on the object. -->
-
<interceptor-stack name="paramsPrepareParamsStack">
-
<interceptor-ref name="exception"/>
-
<interceptor-ref name="alias"/>
-
<interceptor-ref name="i18n"/>
-
<interceptor-ref name="checkbox"/>
-
<interceptor-ref name="datetime"/>
-
<interceptor-ref name="multiselect"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="servletConfig"/>
-
<interceptor-ref name="prepare"/>
-
<interceptor-ref name="chain"/>
-
<interceptor-ref name="modelDriven"/>
-
<interceptor-ref name="fileUpload"/>
-
<interceptor-ref name="staticParams"/>
-
<interceptor-ref name="actionMappingParams"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="conversionError"/>
-
<interceptor-ref name="validation">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="workflow">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
</interceptor-stack>
-
-
<!-- A complete stack with all the common interceptors in place.
-
Generally, this stack should be the one you use, though it
-
may do more than you need. Also, the ordering can be
-
switched around (ex: if you wish to have your servlet-related
-
objects applied before prepare() is called, you'd need to move
-
servletConfig interceptor up.
-
-
This stack also excludes from the normal validation and workflow
-
the method names input, back, and cancel. These typically are
-
associated with requests that should not be validated.
-
-->
-
<interceptor-stack name="defaultStack">
-
<interceptor-ref name="exception"/>
-
<interceptor-ref name="alias"/>
-
<interceptor-ref name="servletConfig"/>
-
<interceptor-ref name="i18n"/>
-
<interceptor-ref name="prepare"/>
-
<interceptor-ref name="chain"/>
-
<interceptor-ref name="scopedModelDriven"/>
-
<interceptor-ref name="modelDriven"/>
-
<interceptor-ref name="fileUpload"/>
-
<interceptor-ref name="checkbox"/>
-
<interceptor-ref name="datetime"/>
-
<interceptor-ref name="multiselect"/>
-
<interceptor-ref name="staticParams"/>
-
<interceptor-ref name="actionMappingParams"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="conversionError"/>
-
<interceptor-ref name="validation">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="workflow">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="debugging"/>
-
<interceptor-ref name="deprecation"/>
-
</interceptor-stack>
-
-
<!-- The completeStack is here for backwards compatibility for
-
applications that still refer to the defaultStack by the
-
old name -->
-
<interceptor-stack name="completeStack">
-
<interceptor-ref name="defaultStack"/>
-
</interceptor-stack>
-
-
<!-- Sample execute and wait stack.
-
Note: execAndWait should always be the
last interceptor. -->
-
<interceptor-stack name="executeAndWaitStack">
-
<interceptor-ref name="execAndWait">
-
<param name="excludeMethods">input,back,cancel
</param>
-
</interceptor-ref>
-
<interceptor-ref name="defaultStack"/>
-
<interceptor-ref name="execAndWait">
-
<param name="excludeMethods">input,back,cancel
</param>
-
</interceptor-ref>
-
</interceptor-stack>
-
-
</interceptors>
-
-
<default-interceptor-ref name="defaultStack"/>
-
-
......
-
</package>
-
<package name="struts-default" abstract="true">
-
<interceptors>
-
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
-
......
-
<interceptor-stack name="defaultStack">
-
<interceptor-ref name="exception"/>
-
<interceptor-ref name="alias"/>
-
<interceptor-ref name="servletConfig"/>
-
<interceptor-ref name="i18n"/>
-
<interceptor-ref name="prepare"/>
-
<interceptor-ref name="chain"/>
-
<interceptor-ref name="scopedModelDriven"/>
-
<interceptor-ref name="modelDriven"/>
-
<interceptor-ref name="fileUpload"/>
-
<interceptor-ref name="checkbox"/>
-
<interceptor-ref name="datetime"/>
-
<interceptor-ref name="multiselect"/>
-
<interceptor-ref name="staticParams"/>
-
<interceptor-ref name="actionMappingParams"/>
-
<interceptor-ref name="params"/>
-
<interceptor-ref name="conversionError"/>
-
<interceptor-ref name="validation">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="workflow">
-
<param name="excludeMethods">input,back,cancel,browse
</param>
-
</interceptor-ref>
-
<interceptor-ref name="debugging"/>
-
<interceptor-ref name="deprecation"/>
-
</interceptor-stack>
-
</interceptors>
-
<default-interceptor-ref name="defaultStack"/>
-
</package>
-
package com.pc.user.web.action;
-
import com.opensymphony.xwork2.ActionSupport;
-
/
-
* 用户Action
-
-
@author Switch
-
* @data 2016年11月20日
-
* @version V1.0
-
/
-
public
class UserAction extends ActionSupport {
-
private
static
final
long serialVersionUID =
366851530423407749L;
-
/
-
模拟保存用户
-
* @return
-
/
-
public String saveUser() {
-
System.out.println(
"保存成功");
-
return SUCCESS;
-
}
-
-
/
-
模拟删除用户
-
-
@return
-
/
-
public String removeUser() {
-
System.out.println(
"删除成功");
-
return SUCCESS;
-
}
-
}
-
package com.pc.user.web.interceptor;
-
import com.opensymphony.xwork2.ActionInvocation;
-
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
-
/
-
拦截器1
-
-
@author Switch
-
* @data 2016年11月20日
-
* @version V1.0
-
*/
-
public
class MyInterceptor1 extends AbstractInterceptor {
-
private
static
final
long serialVersionUID = -
623800184006159480L;
-
-
@Override
-
public String intercept(ActionInvocation invocation) throws Exception {
-
System.out.println(
"访问Action前,MyInterceptor1拦截了");
-
// //放行:如果有下一个拦截器执行下一个拦截器,如果该拦截器是最后一个,则执行动作方法。
-
String invoke = invocation.invoke();
-
System.out.println(
"访问Action后,MyInterceptor1拦截了");
-
-
return invoke;
-
}
-
}
-
<?xml version="1.0" encoding="UTF-8"?>
-
<!DOCTYPE struts PUBLIC
-
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
-
-
<struts>
-
<constant name="struts.devMode" value="true"/>
-
-
<!-- 定义一些公共的配置:针对当前web工程的 -->
-
<package name="myDefaultPackage" extends="struts-default" abstract="true">
-
<interceptors>
-
<!-- 声明拦截器 -->
-
<interceptor name="myInterceptor1" class="com.pc.user.web.interceptor.MyInterceptor1"/>
-
</interceptors>
-
</package>
-
-
<package name="pack1" extends="myDefaultPackage" namespace="">
-
-
<global-results>
-
<result name="success" type="dispatcher">/success.jsp
</result>
-
</global-results>
-
-
<!-- 用户保存 -->
-
<action name="saveUser" class="com.pc.user.web.action.UserAction" method="saveUser">
-
<!-- 使用拦截器 -->
-
<interceptor-ref name="myInterceptor1">
</interceptor-ref>
-
<result name="main" type="dispatcher">/main.jsp
</result>
-
</action>
-
-
<!-- 用户删除 -->
-
<action name="removeUser" class="com.pc.user.web.action.UserAction" method="removeUser"/>
-
-
</package>
-
</struts>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>主页
</title>
-
</head>
-
<body>
-
<a href="${pageContext.request.contextPath}/saveUser.action"</span>></span>用户保存<span class="hljs-tag"></<span class="hljs-name">a</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"${pageContext.request.contextPath}/removeUser.action">用户删除
</a>
-
</body>
-
</html>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>成功
</title>
-
</head>
-
<body>
-
<h2>执行成功
</h2>
-
<% System.out.println("执行成功"); %>
-
</body>
-
</html>
访问Action前,MyInterceptor1拦截了
保存成功
执行成功
访问Action后,MyInterceptor1拦截了
删除成功
执行成功
-
package com.opensymphony.xwork2.interceptor;
-
import com.opensymphony.xwork2.ActionInvocation;
-
import com.opensymphony.xwork2.util.TextParseUtil;
-
import com.opensymphony.xwork2.util.logging.Logger;
-
import com.opensymphony.xwork2.util.logging.LoggerFactory;
-
-
import java.util.Collections;
-
import java.util.Set;
-
public
abstract
class MethodFilterInterceptor extends AbstractInterceptor {
-
protected
transient Logger log = LoggerFactory.getLogger(getClass());
-
-
protected Set<String> excludeMethods = Collections.emptySet();
-
protected Set<String> includeMethods = Collections.emptySet();
-
-
public void setExcludeMethods(String excludeMethods) {
-
this.excludeMethods = TextParseUtil.commaDelimitedStringToSet(excludeMethods);
-
}
-
-
public Set<String> getExcludeMethodsSet() {
-
return excludeMethods;
-
}
-
-
public void setIncludeMethods(String includeMethods) {
-
this.includeMethods = TextParseUtil.commaDelimitedStringToSet(includeMethods);
-
}
-
-
public Set<String> getIncludeMethodsSet() {
-
return includeMethods;
-
}
-
-
@Override
-
public String intercept(ActionInvocation invocation) throws Exception {
-
if (applyInterceptor(invocation)) {
-
return doIntercept(invocation);
-
}
-
return invocation.invoke();
-
}
-
-
protected boolean applyInterceptor(ActionInvocation invocation) {
-
String method = invocation.getProxy().getMethod();
-
// ValidationInterceptor
-
boolean applyMethod = MethodFilterInterceptorUtil.applyMethod(excludeMethods, includeMethods, method);
-
if (log.isDebugEnabled()) {
-
if (!applyMethod) {
-
log.debug(
"Skipping Interceptor... Method [" + method +
"] found in exclude list.");
-
}
-
}
-
return applyMethod;
-
}
-
-
protected abstract String doIntercept(ActionInvocation invocation) throws Exception;
-
}
-
package com.pc.user.web.action;
-
-
import com.opensymphony.xwork2.ActionContext;
-
import com.opensymphony.xwork2.ActionSupport;
-
-
/
-
* 用户Action
-
-
@author Switch
-
* @data 2016年11月20日
-
* @version V1.0
-
/
-
public
class UserAction extends ActionSupport {
-
private
static
final
long serialVersionUID =
366851530423407749L;
-
-
/
-
模拟登陆
-
-
@return
-
/
-
public String login() {
-
ActionContext.getContext().getSession().put(
"loginUser",
"switch");
-
System.out.println(
"登陆成功");
-
return
"main";
-
}
-
-
/
-
模拟保存用户
-
-
@return
-
/
-
public String saveUser() {
-
System.out.println(
"保存成功");
-
return SUCCESS;
-
}
-
-
/
-
模拟删除用户
-
-
@return
-
/
-
public String removeUser() {
-
System.out.println(
"删除成功");
-
return SUCCESS;
-
}
-
}
-
package com.pc.user.web.interceptor;
-
import com.opensymphony.xwork2.ActionContext;
-
import com.opensymphony.xwork2.ActionInvocation;
-
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
-
/*
-
* 权限过滤器,实现登录验证
-
* 通过实现方法过滤拦截器实现
-
-
@author Switch
-
* @data 2016年11月20日
-
* @version V1.0
-
*/
-
public
class PrivilegeInterceptor extends MethodFilterInterceptor {
-
private
static
final
long serialVersionUID = -
623800184006159480L;
-
-
@Override
-
protected String doIntercept(ActionInvocation invocation) throws Exception {
-
// 判断session中是否有用户数据
-
ActionContext context = ActionContext.getContext();
-
Object loginUser = context.getSession().get(
"loginUser");
-
// 用户不存在,则返回登录界面
-
if (loginUser ==
null) {
-
return
"login";
-
}
-
// 放行
-
return invocation.invoke();
-
}
-
}
-
<?xml version="1.0" encoding="UTF-8"?>
-
<!DOCTYPE struts PUBLIC
-
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
-
-
<struts>
-
<constant name="struts.devMode" value="true"/>
-
-
<!-- 定义一些公共的配置:针对当前web工程的 -->
-
<package name="myDefaultPackage" extends="struts-default" abstract="true">
-
<interceptors>
-
<!-- 声明权限拦截器 -->
-
<interceptor name="privilegeInterceptor1" class="com.pc.user.web.interceptor.PrivilegeInterceptor"/>
-
<!-- 定义一个拦截器栈:包含权限拦截器和默认拦截器栈 -->
-
<interceptor-stack name="myDefaultStack">
-
<interceptor-ref name="privilegeInterceptor1">
-
<!-- 给拦截器注入参数:告知拦截器拦截哪些或者是排除哪些方法。挑少的写
-
传入参数的name是找MethodFilterInterceptor中setXXXX方法后面的部分。
-
传入参数的值写的是动作方法名称,如果是多个方法,以逗号分隔。
-
<param name="excludeMethods">login</param> -->
-
</interceptor-ref>
-
<interceptor-ref name="defaultStack"/>
-
</interceptor-stack>
-
</interceptors>
-
-
<!-- 定义默认拦截器栈:把myDefaultStack声明为默认拦截器栈 -->
-
<default-interceptor-ref name="myDefaultStack" />
-
</package>
-
-
<package name="pack1" extends="myDefaultPackage" namespace="">
-
<!-- 全局结果视图 -->
-
<global-results>
-
<result name="success" type="dispatcher">/success.jsp
</result>
-
<result name="login" type="redirect">/login.jsp
</result>
-
</global-results>
-
-
-
<!-- 用户登录 -->
-
<action name="login" class="com.pc.user.web.action.UserAction" method="login">
-
<!-- 转发到主页 -->
-
<result name="main" type="dispatcher">/main.jsp
</result>
-
<interceptor-ref name="myDefaultStack">
-
<!-- 指定给过滤器栈中哪个过滤器设置参数 -->
-
<param name="privilegeInterceptor1.excludeMethods">login
</param>
-
</interceptor-ref>
-
</action>
-
-
<!-- 用户保存 -->
-
<action name="saveUser" class="com.pc.user.web.action.UserAction" method="saveUser"/>
-
-
<!-- 用户删除 -->
-
<action name="removeUser" class="com.pc.user.web.action.UserAction" method="removeUser"/>
-
-
</package>
-
</struts>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>登录页
</title>
-
</head>
-
<body>
-
<a href="${pageContext.request.contextPath}/login.action">用户登录
</a>
-
</body>
-
</html>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>主页
</title>
-
</head>
-
<body>
-
<a href="${pageContext.request.contextPath}/saveUser.action"</span>></span>用户保存<span class="hljs-tag"></<span class="hljs-name">a</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"${pageContext.request.contextPath}/removeUser.action">用户删除
</a>
-
</body>
-
</html>
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<title>成功
</title>
-
</head>
-
<body>
-
<h2>执行成功
</h2>
-
<% System.out.println("执行成功"); %>
-
</body>
-
</html>