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类//改为继承的类是MethodFilterInterceptorpublic class ListInterceptor extends MethodFilterInterceptorstruts.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.javapublic 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.javapublic 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.javapublic 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新闻热点
疑难解答