Struts2 拦截器

拦截器:
Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能(数据转移,类型转换,数据校验)。拦截器方法在Action执行之前或者之后执行。
拦截器栈:从结构上看,拦截器栈相当于多个拦截器的组合。
从功能上看,拦截器栈也是拦截器。



拦截器的工作原理:
拦截器的执行过程是一个递归的过程。



自定义拦截器:
方法一:实现InterCeptor接口
- void init();初始化拦截器所需资源
- void destroy();释放在init()中分配的资源
- String intercept(ActionInvocation ai) throws Exception
  .实现拦截器功能
  .利用ActionInvocation参数获取Action状态
  .返回result字符串作为逻辑视图

方法二:继承AbstractInterceptor类
- 提供了init()和destroy()方法的实现
- 只需要实现interceptor方法即可






拦截器示例:
计算Action的执行时间
实现步骤:
     -创建拦截器
     -在配置文件中定义拦截器并引用它


写在struts标签中:
<constant name="struts.enable.DynamicMethodInvocation"value="false"></constant>
<constant name="struts.devMode" value="true"></constant>

拦截器TimerInterceptor:
public class TimerInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throwsException {
//1.执行action之前
long start = System.currentTimeMillis();
//2.执行下一个拦截器,如果已经是最后一个拦截器,则执行目标Action
String result=invocation.invoke();//调用下一个拦截器
//3.执行action之后
long end = System.currentTimeMillis();
System.out.println("执行action花费的时间:"+(end-start)+"ms");
return result;
}
}


在struts.xml文件中配置添加并引用:
<package name="default" namespace="/"extends="struts-default">
<interceptors>
<interceptor name="mytimer"class="com.imooc.interceptor.TimerInterceptor"></interceptor>
</interceptors>
<action name="timer"class="com.imooc.action.TimerAction">
<result>/success.jsp</result>
<!--当为包中的某个action显示指定了某个拦截器,则默认拦截器不会起作用,需要手工引用。-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 引用拦截器 -->
<interceptor-ref name="mytimer"></interceptor-ref>
</action>
</package>


配置action的类:
public class TimerAction extends ActionSupport {
@Override
public String execute() throws Exception {
for(int i=0;i<10000;i++){
System.out.println("I LOVE IMOOC!");
}
return SUCCESS;
}
}

创建一个简单的success界面。
程序运行,进入action之前先运行拦截器记录下进入action的时间,然后运行action,之后又返回拦截器记录结束的时间,跳转到success.jsp。



Struts2内建拦截器:
params拦截器:负责将请求参数设置为action苏醒
staticParams拦截器:将配置文件中action元素的子元素param参数设置为action属性
servletConfig拦截器:将源于servlet API的各种对象注入到action,必须实现对应接口。
fileUpload拦截器:对文件上传提供支持,将文件和元数据设置到对应的action属性
exception拦截器:捕获异常,并且将异常映射到用户自定义的错误页面
validation拦截器:调用验证框架进行数据验证


在struts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器。
只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器。
当为包中的某个action显示指定了某个拦截器,则默认拦截器不会起作用,需要手工引用。
拦截器栈中的各个拦截器的顺序很重要(struts默认的一般放前面)。

创建自定义拦截器及拦截器栈实现权限校验:
首先在项目创建/WEB-INF/page/manager.jsp:
 <body>
  后台管理页面只有已登录的用户才能够访问!
  </body>


然后配置实现:
<!-- 通过访问这个action可以直接访问后台管理页面 -->
<action name="auth">
<result>/WEB-INF/page/manager.jsp</result>
</action>


通过访问:http:/localhost:8080/struts-timerInterceptor/auth便可以直接访问到。


然后再webroot下面创建一个登录页面login.jsp:
<h2>用户登陆</h2>
  ${loginError }
   
    用户名:<input type="text"name="username" /><br/>
    密码:<inputtype="password" name="password"/><br/>
    <input type="submit"value="登陆"/>
   
  </body>


创建action类:
public class LoginAction extends ActionSupport implementsSessionAware{
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;
}
private String username;
private String password;
private Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
//处理登陆请求
public String login(){
if("admin".equals(username)&&"123".equals(password)){
session.put("loginInfo", username);
return SUCCESS;
}else{
session.put("loginError", "用户名或密码不正确");
return ERROR;
}
}
}


配置LoginAction:
<action name="login" class="com.imooc.action.LoginAction"method="login">
<result>/WEB-INF/page/manager.jsp</result>
<result name="error">/login.jsp</result>
</action>


上面login.jsp中的${loginError }语句就是在error时使用。


创建拦截器:
public class AuthInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throwsException {
ActionContext context = ActionContext.getContext();
Map<String,Object> session=context.getSession();
if(session.get("loginInfo")!=null){
String result=invocation.invoke();
return result;
}else{
return "login";
}
}
}

在struts.xml中配置:
<interceptors>
<interceptor name="auth"class="com.imooc.interceptor.AuthInterceptor"></interceptor>
<!-- 因为在有自己定义的拦截器的时候默认拦截器就会失效,这里把默认拦截器和自定义拦截器方法一个拦截器栈里便于使用-->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="auth"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="auth">
<result>/WEB-INF/page/manager.jsp</result>
<result name="login">/login.jsp</result>
<interceptor-ref name="myStack"></interceptor-ref>
</action>

配置完成后,直接访问auth.action时就不会进入manage.jsp页面,只有正确通过login.jsp正确登陆后才能访问manage.jsp页面。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值