前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Struts2拦截器

Struts2拦截器

作者头像
HUC思梦
发布2020-09-03 10:40:14
3610
发布2020-09-03 10:40:14
举报

拦截器

拦截器分类: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>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-07-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 拦截器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档