Struts2拦截器

2020-09-03 10:40:14 浏览数 (1)

拦截器

拦截器分类:1) struts框架自带拦截器: sturts-default.xml文件中里有多种拦截器如params.......等, 在struts.xml中只要包extends了struts-default,那么每个Action都拥有一些拦截器,拥有的这些叫默认拦截器栈defaultStack 2) 自定义拦截器(权限控制等) 如何自定义拦截器: 1) com.opensymphony.xwork2.interceptor.Interceptor接口 ----------> (只有init,destroy,intercept方法) 要实现接口里的三个方法: public void destroy(){} public void init(){} public String intercept(ActionInvocation invocation) throws Exception {

String result = invocation.invoke(); }

2) com.opensymphony.xwork2.interceptor.AbstractInterceptor 抽象类 ---------->(只有intercept方法) public String intercept(ActionInvocation invocation)throws Exception {

String result = invocation.invoke();

3)com.opensymphony.xwork2.interceptor.MethodFilterInterceptor抽象类 ----------> (这个拦截器可以指定要拦截或不拦截的方法列表)

protected String doIntercept(ActionInvocation arg0) throws Exception {

String result=arg0.invoke();

Struts.xml中配置:

代码语言:javascript复制
<struts>
<package name="hello1" extends="struts-default">

<interceptors>
<interceptor name="interceptorDemo" class="interceptor.InterceptorDemo">
<param name="time">300</param>
</interceptor>
<interceptor name="abstractInterceptorDemo" class="interceptor.AbstractInterceptorDemo"></interceptor>
<interceptor name="methodFilterInterceptorDemo" class="interceptor.MethodFilterInterceptorDemo"></interceptor>
</interceptors>

<action name="loginAction_*" class="action.LoginAction" method="{1}">

<result name="success">/index.jsp</result>
<result name="final">/login.jsp</result>

<interceptor-ref name="interceptorDemo"></interceptor-ref>
<interceptor-ref name="abstractInterceptorDemo"></interceptor-ref>
<interceptor-ref name="methodFilterInterceptorDemo">
<param name="includeMethods">login2</param>
<!--
对LoginAction中的execute方法进行拦截
-->
<param name="excludeMethods">login1,login3</param>
<!--
对LoginAction中的MyExecute方法不进行拦截
-->
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>

</action>

</package>


</struts>

注意:1)多个拦截器作用于一个Action,拦截器是有顺序的 2)设置拦截器或不拦截的方法时,如果有多个方法,那么以逗号(,)分隔, 如果一个方法的名字同时出现在execludeMethods和includeMethods参数中,那么它会被当作要拦截的方法。 也就是说, includeMethods优先于execludeMethods。

拦截器栈:就是将一些拦截器组合起来进行统一管理

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="hello1" extends="struts-default">

<interceptors>
<interceptor name="interceptorDemo" class="interceptor.InterceptorDemo">
<param name="time">300</param>
</interceptor>
<interceptor name="abstractInterceptorDemo" class="interceptor.AbstractInterceptorDemo"></interceptor>
<interceptor name="methodFilterInterceptorDemo" class="interceptor.MethodFilterInterceptorDemo"></interceptor>
<!-- 拦截器栈1 -->
<interceptor-stack name="one">
<interceptor-ref name="interceptorDemo"></interceptor-ref>
<interceptor-ref name="abstractInterceptorDemo"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
<!-- 拦截器栈2 -->
<interceptor-stack name="two">
<interceptor-ref name="methodFilterInterceptorDemo">
<param name="includeMethods">login2</param>
<param name="excludeMethods">login1,login3</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>

</interceptors>

<action name="loginAction_*" class="action.LoginAction" method="{1}">
<result name="success">/index.jsp</result>
<result name="final">/login.jsp</result>

<interceptor-ref name="one"></interceptor-ref>
<interceptor-ref name="two"></interceptor-ref>
</action>

</package>


</struts>

拦截器的应用 1.访问权限拦截器

1)JSP 2)Action:获取页面上的数据,验证成功后,把用户信息存入session中,然后跳转到另一个Action 3)对另一个Action进行拦截,从session中取值,判断用户是否登录,在进行跳转 4)为什么写二个Action,因为,第一个Action是为了往session中放值,如果是后拦截不起作用。所以得用第二个Action 5)struts.xml要对第二个Action配置上拦截器 6)访问权限为什么非写在拦截器里:为了重用(有可能其它Action也要用)

使用令牌token防止表单重复提交

1)index.jsp

代码语言:javascript复制
<%@ taglib prefix="s" uri="/struts-tags"%>
<body>
<form action="login">

username:
<input type="text" name="username" />
<br>
password:
<input type="password" name="password" />
<br>
<s:token></s:token>
<!-- GR8JKKSN5YMG1GY5VA35NOZ40HE4QA1A -->
<input type="submit" value="提交">

</form>
</body>

2)action

代码语言:javascript复制
//action类是需要继承ActionSupport这个类的,不然struts识别不了
//在重复提交时,Token会产生一个重复的提交的信息,由ActionSupport得到信息后,在存入TokenAction这个类中
public class TokenAction extends ActionSupport {

public String execute() throws Exception {

return SUCCESS;
}

}

3)struts.xml

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

<!-- i18n这个常量的值是什么,这个值是当前默认文件的相对路径,但是不带后缀
当无其它国际化配置文件时,使用默认配置文件 -->
<constant name="struts.custom.i18n.resources" value="action.resourc"></constant>


<package name="action" namespace="/" extends="struts-default">
<action name="tokenAction" class="action.TokenAction">
<result name="success" >/welcome.jsp</result>

<!-- name="invalid.token" 表单重复提交就转到此页面,并提示用户已重复提交 -->
<result name="invalid.token" >/error.jsp</result>

<!-- 为action引入token拦截器 -->
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>

</package>
</struts>

0 人点赞