监听器,拦截器,过滤器
一、监听器(Listener)
监听器是当web应用启动时跟随启动,停止时跟随销毁,起到对项目的监听作用,但是只初始化一次,通常在 “客户/服务(c/s)” 经常用到,用于监听一些重要事件发生,监听器对象可在事情发生前、后做一些必要的处理, 例如:数据库连接池的连接, 统计在线人数,利用HttpSessionLisener,
加载初始化信息:利用ServletContextListener,统计网站访问量,实现访问监控。
首先在web.xml文件中添加监听标签然后引入地址(URL)

二、过滤器(Filter)
过滤器:顾名思义就是过滤的作用,就是对web请求进行过滤向字符编码和请求路径(URL)、逻辑判断等,过滤器一般在web请求后,servlet前,过滤器也是同web启动而启动,停止而销毁的,也是只初始化一次,过滤器是基于函数回调,过滤器依赖于servlet容器,过滤器可以对几乎所有的请求起作用,过滤器不能访问action上下文、值栈里的对象,过滤器只能在容器初始化时被调用一次,在web.xml文件中。
三、拦截器(Interceptor)
拦截器:拦截器是基于java的反射机制,拦截器不依赖于servlet容器,拦截器只能对action请求起作用,拦截器可以访问action上下文、值栈里的对象,在action的生命周期中,拦截器可以多次被调用,拦截器与监听器和过滤器不同,拦截器不是在web.xml文件中配置的,而是在StringMvc文件中配置,例如:

拦截器 LoginHandlerIntercepter.java文件的书写
package interceptor;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import entity.SysAdmin;
import utils.StringUtil;
public class LoginHandlerIntercepter implements HandlerInterceptor {
/**
* 该方法也是需要当前对应的Interceptor(拦截器) 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,
* 也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的 一般是用来进行资源的释放等操作
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception modelAndView)
throws Exception {
// TODO Auto-generated method stub
System.out.println("------------------------------------------------------------afterCompletion------------------------------------------------------------");
}
/**
* 由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion 方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。
* postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,
* 所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,
* 也就是说先声明的Interceptor 的postHandle 方法反而会后执行,这和Struts2里面的Interceptor 的执行过程有点类型。
* Struts2 里面的Interceptor 的执行过程也是链式的,只是在Struts2 里面需要手动调用ActionInvocation 的invoke 方法来触发对下一个Interceptor 或者是Action 的调用,
* 然后每一个Interceptor 中在invoke 方法调用之前的内容都是按照声明顺序执行的,而invoke 方法之后的内容就是反向的
该方法能够对返回前端的ModelAndView数据进行处理。*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView modelAndView)
throws Exception {
// TODO Auto-generated method stub
System.out.println("------------------------------------------------------------postHandle------------------------------------------------------------");
}
/**
* 顾名思义,该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。
* 每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,
* 所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。
* 该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;
* 当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法
比如接口验签,解密,权限控制等操作。*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
// TODO Auto-generated method stub
System.out.println("------------------------------------------------------------preHandle------------------------------------------------------------");
HttpSession session=request.getSession();
String uri = request.getRequestURI().toString();
Object suserId = session.getAttribute("suserId");
PrintWriter out = response.getWriter();
if(session!=null) {
//System.out.println("-------------------------------------session--------------------------------------");
if(suserId!= null || uri.indexOf("menu.action")>-1) {
System.out.println("--------------------------------"+session.getAttribute("suserId")+"---- suserId not null!------------------------------------");
//if(uri.indexOf(".action")>0) {
System.out.println("-------------------------------"+uri.indexOf(".action")+"----- action true!------------------------------------");
return true;
//}
}else {
//跳转页面_top是跳到上一级
out.println("<html>");
out.println("<script>");
out.println("window.open ('"+request.getContextPath()+"/login.jsp','_top')");
out.println("alert('页面过期,请重新登录!LJQ');");
out.println("</script>");
out.println("</html>");
out.flush();
out.close();
return false;
}
}
//PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<script>");
out.println("window.open ('"+request.getContextPath()+"/login.jsp','_top')");
out.println("alert('没有相关权限!LJQ');");
out.println("</script>");
out.println("</html>");
out.flush();
out.close();
return false;
}
}
拦截器也可以这样书写SysInterceptor
package cn.appsys.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import cn.appsys.pojo.BackendUser;
import cn.appsys.pojo.DevUser;
import cn.appsys.tools.Constants;
public class SysInterceptor extends HandlerInterceptorAdapter {
private Logger logger = Logger.getLogger(SysInterceptor.class);
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception{
logger.debug("SysInterceptor preHandle ==========================");
HttpSession session = request.getSession();
BackendUser backendUser = (BackendUser)session.getAttribute(Constants.USER_SESSION);
DevUser devUser = (DevUser)session.getAttribute(Constants.DEV_USER_SESSION);
if(null != devUser){ //dev SUCCESS
return true;
}else if(null != backendUser){ //backend SUCCESS
return true;
}else{
response.sendRedirect(request.getContextPath()+"/403.jsp");
return false;
}
}
}
此篇只是自己学习

浙公网安备 33010602011771号