1、拦截器与过滤器
1、拦截器属于struts框架,只能拦截action及其方法
2、过滤器属于web容器,过滤一切请求(action,servlet,hsp,html等)
3、实现方法:拦截器——动态代理;过滤器——函数回调。
2、拦截器与拦截器栈(stark)
1、多个拦截器组成拦截器栈
2、二者的引用方法一致
3、拦截器的实现步骤
1、编写拦截器(接口Interceptor//继承AbstractInterceptor)
2、在struts.xml中配置拦截器
3、在action中引用配置好的拦截器
4、拦截器常用配置
1、当引用了自定义的拦截器后,默认配置拦截器失效;
2、当引用了自定义的拦截器后,又想使默认拦截器,可配置成拦截器栈,再引用到action
3、当多个action都要引用同一个拦截器时,可配置为默认拦截器
<package name="interceptor" namespace="/" extends="struts-default">
<!-- 拦截器/栈配置部分 -->
<interceptors>
<!-- 配置拦截器 -->
<interceptor name="time" class="com.interceptor.TimeInterceptor"></interceptor>
<!-- 配置拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="time"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默认拦截器/栈 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<action name="hello" class="com.action.HelloAction">
<result>/index.jsp</result>
<!-- 拦截器/栈引用部分 -->
<interceptor-ref name="time"></interceptor-ref>
</action>
</package>
5、方法拦截器(拦截action的方法)
java类
//改为继承的类是MethodFilterInterceptor
public class ListInterceptor extends MethodFilterInterceptor
struts.xml需要注意的配置
<interceptor name="" class="">
<param name="includeMethods">被拦截的方法名</param>
<param name="excludeMethods">不被拦截的方法名</param>
</interceptor>
6、案例:权限控制
login.jsp
<body>
<form action="login" method="post">
请输入姓名<input type="text" name="name"><br>
<input type="submit" value="登录"><br>
</form>
<a href="hello">去隐藏页面</a>
</body>
success.jsp
为了便与测试该页放在WEB-INF下(无法直接访问)
<body>
<h1>user:${user}name:${name},欢迎您来到登录后才能显示的页面!</h1>
</body>
LoginAction.java
public class LoginAction extends ActionSupport{
private String name;
@Override
public String execute() throws Exception {
// TODO 自动生成的方法存根
//把用户名保存到session
ActionContext.getContext().getSession().put("user", name);
System.out.println("execute----------"+"put(user, name)");
return super.execute();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
LoginInterceptor.java
public class LoginInterceptor extends AbstractInterceptor{
//注意:如果是接口Interceptor是xwork2包下的
@Override
public String intercept(ActionInvocation arg0) throws Exception {
// TODO 自动生成的方法存根
//现获取发起请求的action的名(没有后缀),判断是否为登录的action
String ActionName=arg0.getProxy().getActionName();
if (ActionName.equals("login")) {
return arg0.invoke();
}
Object object=arg0.getInvocationContext().getSession().get("user");
if (object==null) {
System.out.println("LoginIntercept----------"+"object==null");
return Action.LOGIN;
}
return arg0.invoke();
}
}
HelloAction.java
public class HelloAction extends ActionSupport{
private String name;
@Override
public String execute() throws Exception {
// TODO 自动生成的方法存根
System.out.println("hello-------name="+ActionContext.getContext().getSession().get("user"));
return super.execute();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
struts.xml
<package name="interceptor" namespace="/" extends="struts-default">
<interceptors>
<interceptor-stack>
<interceptor name="loginInterceptor" class="com.interceptor.LoginInterceptor">
</interceptor>
<interceptor-stack name="mystack">
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默认拦截器/栈 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<!-- 配置默认result -->
<global-results>
<result name="login">/login.jsp</result>
</global-results>
<action name="hello" class="com.action.HelloAction">
<result>/WEB-INF/success.jsp</result>
</action>
<action name="login" class="com.action.LoginAction">
<result>/WEB-INF/success.jsp</result>
</action>
</package>
测试hello
测试login
再测试hello