Struts2(十四)拦截器实现权限管理
一、认识拦截器
拦截器也是一个类
拦截器可以在Action被调用之前和之后执行代码
框架很多核心功能是拦截器实现的
拦截器的特点:
拦截器自由组合,增强了灵活性、扩展性、有利于系统解耦
拦截器可以拦截Action请求
在访问的Action执行之前和执行之后执行代码实现某项功能
Struts2:
大部分功能是在拦截器中实现的如:接收输入的参数,数据验证,文件上传,国际化等
应用程序:
需要在Action执行的前后执行特定功能
Action执行时间统计,Action访问权限管理
Action添加功能,Action代码不动使用拦截器实现功能
二、拦截器工作方式
三、自带的一些拦截器
Struts2还有很多拦截器。
四、拦截器栈
从结构上 :拦截器栈就是一组拦截器
从功能上:拦截器栈也是拦截器
五、默认拦截器
六、计算运行Action的时间
MyTimerInterceptor
package com.pb.web.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyTimerInterceptor extends AbstractInterceptor { //实现父类的方法 @Override public String intercept(ActionInvocation invocation) throws Exception { //执行前的时间 long startTime=System.currentTimeMillis(); System.out.println("执行Action之前的工作,开始时间:"+startTime + " ms"); //执行这个拦截器之后的拦截器或者Action String result=invocation.invoke(); //获取执行结束的时间 执行Action之后的工作:计算并输出执行时间 long endTime=System.currentTimeMillis(); //执行时间差 long execTime=endTime-startTime; System.out.println("执行Action之后的工作,结束时间:"+endTime+",执行耗时:" + execTime + " ms"); return result; } }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 禁用动态方法调用--> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <!-- 启用开发模式后,更改设置不用重启Tomcat--> <constant name="struts.devMode" value="true" /> <!-- 包默认继承strus-default --> <package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="myTimer" class="com.pb.web.interceptor.MyTimerInterceptor"></interceptor> </interceptors> <action name="hello" class="com.pb.web.action.HelloAction" method="hello"> <result name="success">/index.jsp</result> <result name="input">/index.jsp</result> <result name="error">/index.jsp</result> <!-- 启用自定义的拦截器--> <interceptor-ref name="myTimer"/> <!-- 同时启用struts2默认的拦截器名称为defaultStack --> <interceptor-ref name="defaultStack"/> </action> </package> </struts>
七、自定义拦截器
struts2有三种方法自定义拦截器
- 实现interceptor接口
- 继承AbstractInterceptor类
- 继承MethodFilterInterceptor类
八、简单例子实现登录后某个页面才能访问
登录后才能访问/WEB-INF/page/security.jsp
实体类
package com.pb.entity; /* * 用户类 */ public class User { private String username; private String password; 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; } }
package com.pb.web.action; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; import com.pb.entity.User; public class LoginAction extends ActionSupport implements SessionAware { private User user; private Map<String, Object> session; //登录 public String login(){ if("admin".equals(user.getUsername())&&"admin".equals(user.getPassword())){ session.put("user", user); return SUCCESS; } return ERROR; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public void setSession(Map<String, Object> session) { this.session=session; } public Map<String, Object> getSession() { return session; } }
拦截器
package com.pb.web.interceptor; import java.util.Map; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.pb.entity.User; public class MyInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { Map<String, Object> session=ActionContext.getContext().getSession(); //获取session中保持的用户信息 User user=(User) session.get("user"); if(user!=null){ //如果用户已经登录,继续执行剩余的拦截器和Action return invocation.invoke(); }else{ //如果用户尚未登录,返回到登录页面 return Action.LOGIN; } } }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <interceptors> <!--定义权限验证拦截器 --> <interceptor name="myInterceptor" class="com.pb.web.interceptor.MyInterceptor"></interceptor> <!--定义拦截器栈 --> <interceptor-stack name="myStack"> <!--使用默认的拦截器 --> <interceptor-ref name="defaultStack" /> <interceptor-ref name="myInterceptor" /> </interceptor-stack> </interceptors> <!-- 定义全局结果返回login时,返回登录页面--> <global-results> <!--以重定向的方式跳转 --> <result name="login" type="redirect">/login.jsp</result> </global-results> <!-- action--> <action name="login" class="com.pb.web.action.LoginAction" method="login"> <!-- 结果判断和页面跳转--> <result name="success">/loginSuccess.jsp</result> <result name="error">/error.jsp</result> </action> <action name="security"> <interceptor-ref name="myStack" /> <result name="success"> /WEB-INF/page/security.jsp </result> </action> </package> </struts>
九、拦截器使用和与过滤器的不同之处
与过滤器的相同之处:
- 功能相似
- 原理相似
- 方法相似
与过滤器的不同之处:
- 拦截器用于拦截Action请求,而过滤器几乎可以过滤所有的请求
- 拦截器中可以获取Action的当前执行状态,而过滤器不可以
- 过滤器是Servlet中概念,在Web.xml中配置;拦截器是Struts2/Webwork中的概念在struts.xml中配置