1. 拦截器的概述 * 拦截器就是AOP(Aspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。) * 过滤器:过滤从客服端发送到服务器端请求的 * 拦截器:拦截对目标Action中的某些方法进行拦截(登录方法需要放行) * 拦截器不能拦截JSP * 拦截到Action中某些方法 2. 拦截器和过滤器的区别 1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的 2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器 3)拦截器只能对Action请求起作用(Action中的方法),而过滤器可以对几乎所有的请求起作用(CSS JSP JS) * 拦截器 采用 责任链 模式 > 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链 > 责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行 * 在struts2 中可以定义很多个拦截器,将多个拦截器按照特定顺序 组成拦截器栈 (顺序调用 栈中的每一个拦截器 ) 3. Struts2的核心是拦截器,看一下Struts2的运行流程 编写拦截器类
需要继承struts2框架的MethodFilterInterceptor
提供工具类:
**
* BOS项目的工具类
* @authorzhaoqx
*
*/
publicclass BOSUtils {
//获取session对象
publicstatic HttpSession getSession(){
return ServletActionContext.getRequest().getSession();
}
//获取登录用户对象
publicstatic User getLoginUser(){
return (User) getSession().getAttribute("loginUser");
}
} 编写拦截器/**
* 自定义的拦截器,实现用户未登录自动跳转到登录页面
* @authorzhaoqx
*
*/
publicclass BOSLoginInterceptorextends MethodFilterInterceptor{
//拦截方法
protected String doIntercept(ActionInvocation invocation) throws Exception {
//从session中获取用户对象
User user = BOSUtils.getLoginUser();
if(user == null){
//没有登录,跳转到登录页面
return"login";
}
//放行
returninvocation.invoke();
}
}
在struts.xml中配置拦截器
<interceptors>
<!-- 注册自定义拦截器 -->
<interceptor name="bosLoginInterceptor"class="com.itheima.bos.web.interceptor.BOSLoginInterceptor">
<!-- 指定哪些方法不需要拦截 -->
<param name="excludeMethods">login</param>
</interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="bosLoginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<!-- 全局结果集定义 -->
<global-results>
<result name="login">/login.jsp</result>
</global-results>
day03-自定义struts2拦截器
最新推荐文章于 2020-06-30 19:56:25 发布