一、Filter
(一)概述
Java的特殊类,当用户访问服务器资源时,请求优先被过滤器捕获,完成一些特殊的处理,如:登录验证、统一编码、敏感字符过滤等。
(二)创建Filter
1.创建一个类,实现Filter接口;
2.重写init、doFilter、destroy方法;
3.doFilter方法中配置过滤条件
filterChain.doFilter(servletRequest,servletResponse);
XML细节:
<filter>
<filter-name>demo</filter-name>
<filter-class>com.coastline.web.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(三)生命周期
- init:服务器启动后,创建Filter对象,然后调用init方法;只执行一次,用于加载资源
- doFilter:每一次请求被拦截时,会执行;会多次执行
- destroy:服务器关闭后,Filter对象被销毁;只执行一次,用于释放资源
(四)其他特性
1.拦截器配置
(1)/index.jsp
,仅拦截index.jsp资源
(2)/user/*
,拦截/user路径下的所有资源
(3)*.jsp
,拦截所有后缀名为.jsp资源
(4)/*
,拦截所有资源
2.过滤器先后顺序
按照字符串比较规则,值小的优先放行(AFilter优先于BFilter);如果配置了web.xml,<filter-mapping>
定义在上面的优先执行。
3.登录验证
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response =(HttpServletResponse)resp;
String requestURI = request.getRequestURI();
if(requestURI.contains("login.jsp")||requestURI.contains("/loginServlet")){
chain.doFilter(req, resp);
}else{
Object user = request.getSession().getAttribute("user");
if(user!=null){
chain.doFilter(req,resp);
}else{
request.setAttribute("login_error","您尚未登录,请登录");
request.getRequestDispatcher("/login.jsp").forward(request,resp);
}
}
}
二、Listener
(一)概述
Java的特殊类,通过绑定事件、事件源、监听器,实现:当事件源发生某个事件时,执行监听器代码。常用的监听器分类:
- ServletContext
- HttpSession
- ServletRequest
(二)创建Listener
1.创建一个类,实现ServletContextListener/ServletContextAttributeListener/…接口;
2.重写接口方法
- contextInitialized():对象创建后会调用该方法
- contextDestroyed():对象销毁后会调用该方法
3.配置web.xml
<!--配置监听器-->
<listener>
<listener-class>listener.ContextLoaderListener</listener-class>
</listener>
<!--指定初始化的参数-->
<context-param>
<param-name>contextLoadConfig</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
3+.注解
@WebListener