struts2入门(三)——使用拦截器简单的登录验证
一、Struts2拦截器定义
Struts2拦截器是struts2的核心和基础,许多功能都建立在他的基础上、例如:国际化,转换器、校验。
他是实现一个实现一定功能的类,以一种可拔插的方式被定义在action之前或之后,拦截器是AOP的一种实现,底层是一种动态代理模式.
当拦截器按一定的顺序联结成一条链,就会形成拦截器栈(Interceptor Stack)。Struts2拦截器栈在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
二、拦截器和过滤器的区别:
拦截器和过滤器的概念非常类似。
过滤器隶属于web容器,可以过滤一切请求(包括action、servlet、jsp、html等等)。
而拦截器隶属于struts2框架,只能拦截action(无法拦截对jsp的请求)。
过滤器内部采用函数回调来实现。拦截器采用动态代理来实现!
三、配置自定义拦截器及分析原理
自定义拦截器及其使用:
1. 直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor或者继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor
2.通过元素来定义拦截器
3..通过元素来使用拦截器
首先创建拦截器类:
package com.it.struts.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
@SuppressWarnings("serial")
public class MyInterceptor implements Interceptor {
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("method start");
String result = invocation.invoke();
System.out.println("method end");
return result;
}
}
其次需要在struts.xml中定义拦截器:
<package name="default" namespace="/person" extends="struts-default">
<interceptors>
<interceptor name="inter01" class="com.it.struts.interceptor.MyInterceptor"></interceptor>
</interceptors>
然后在需要使用拦截器的action中手动引入:
<action name="personAction" class="com.it.struts.action.PersonAction1">
<interceptor-ref name="inter01"></interceptor-ref>//自定义拦截器
<interceptor-ref name="defaultStack"></interceptor-ref>//默认拦截器
<result name="success">show.jsp</result>
<result name="error" type="redirect">login.jsp</result>
</action>
</package>
这里需要注意的是如果设置自定义拦截器,默认拦截器就会失效,需要手动引入:
<interceptor-ref name="defaultStack"></interceptor-ref>
这里的登录的所有文件在struts2标签中都有,这里不再重复。当运行完整个登录过程后,控制台可以看到:
method start
login
method end
从此结果我们可以看出,拦截器在请求之前进行拦截处理,在请求之后也会进行拦截处理。
四、实现简单的登录拦截
首先创建拦截器:
MyInterceptor2.java
package com.it.struts.interceptor;
import java.util.Map;
import com.it.struts.entity.person;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor2 extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Map session = ActionContext.getContext().getSession();
//获取session作用域内是否有值,这里的session是struts2封装过的。
person person = (person) session.get("person");
if(person!=null){//合法访问
return invocation.invoke();
}else{//user为空说明未经过登陆,跳到登陆页面
return Action.LOGIN;
}
}
}
然后配置struts.xml
<interceptors>
<interceptor name="inter02" class="com.it.struts.interceptor.MyInterceptor2"></interceptor>
//拦截器定义
</interceptors>
<global-results>
<result name="error">/WEB-INF/jsp/error.jsp</result>
<result name="login">login.jsp</result>
//login全局设置
</global-results>
<action name="UserAction" class="com.it.struts.action.UserAction">
//对于任意一action都适用,这里的UserAction只是示例
<interceptor-ref name="inter02"></interceptor-ref>
//引入登录验证
<interceptor-ref name="defaultStack"></interceptor-ref>
//引入默认拦截器,必须引入
<result name="success">show.jsp</result>
</action>
这里我们假设此UserAction需要进行登录验证,将inter02定义并引入,这里的<global-results>
为全局配置,当请求UserAction时,拦截器进行拦截,获取session中的值为空时,就会返回login通过全局配置跳转到ogin.jsp
这里的 session设置方法为:
ActionContext.getContext().getSession().put("person", person);
此拦截器可以作为一个插件,引入到任意struts2项目中进行配置进行使用进行登录验证,有一点是拦截无法实现的,此拦截器只能拦截action请求,如果只进入jsp页面不发送请求,不生效。
上一篇: Struts2 下拦截器的简单使用
下一篇: 初识 Struts2 第一节