持续学习&持续更新中…
学习态度:守破离
Filter_Listener
Filter
什么是Filter
Filter拦截请求原理
chain.doFilter(request, response);
相当于调用服务器的doGet或者doPost方法,如果不调用该方法的话,相当于不去调用服务器的doGet或者doPost方法,那么服务器就不会处理请求,于是就起到了拦截(过滤)请求的作用。
两种使用方式
注解(如果有好几个Filter的话,按照类名的字符串比较它们的大小,小的先执行。【request】):
@WebFilter("/*")
public class LoginFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String uri = request.getRequestURI();
// 优先放开的请求
if (uri.contains("/asset/")
|| uri.contains("/contact/save")) {
chain.doFilter(request, response);
} else if (uri.contains("/admin")
|| uri.contains("/save")
|| uri.contains("/remove")
|| uri.contains("/user/password")
|| uri.contains("/user/updatePassword")) {
// 需要作登录验证的请求
Object user = request.getSession().getAttribute("user");
if (user != null) {
// 登录成功过
chain.doFilter(request, response);
} else {
// 没有登录成功过
response.sendRedirect(request.getContextPath() + "/page/login.jsp");
}
} else {
chain.doFilter(request, response);
}
}
}
XML(如果有好几个Filter的话,哪个写在上面先执行哪个。【request】):
<!-- 配置Filter -->
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.mj.xr.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
生命周期方法
/**
* 当Filter被加载到Web容器中调用(也就是当项目被部署到Web容器Tomcat时)
* @throws ServletException
*/
public void init(FilterConfig config) throws ServletException {
// 适合做一些资源的加载、初始化(ServletContextListener更合适做资源的初始化和一次性加载)
System.out.println("LoginFilter - init");
}
/**
* 当Filter从Web容器中移除时调用(也就是当项目从Web容器中取消部署时)
*/
public void destroy() {
// 适合做一些资源的回收操作
System.out.println("LoginFilter - destroy");
}
dispatcherTypes属性
注解形式:
设置一个:
@WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST)
public class LoginFilter implements Filter {
// ......
}
两个都设置:
@WebFilter(value = "/*", dispatcherTypes = {
DispatcherType.REQUEST, DispatcherType.FORWARD})
public class LoginFilter implements Filter {
XML形式:
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.mj.xr.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
<!-- 可设置一个或两个都设置 -->
<dispatcher>REQUEST</dispatcher> <!-- 不会拦截转发请求 -->
<dispatcher>FORWARD</dispatcher> <!-- 只会拦截转发请求 -->
</filter-mapping>
Listener
ServletContextListener
ServletContext:与项目“同生共死”。ServletContext就代表着项目的生命。
两种使用方式
注解:
@WebListener()
public class ContextListener implements ServletContextListener {
// 项目被部署时调用
@Override
public void contextInitialized(ServletContextEvent sce) {
// 在项目启动(部署)的时候做一些一次性的操作(资源加载)
System.out.println("contextInitialized------------------");
// null参数表示允许值为null
// DateConverter dateConverter = new DateConverter(null);
// dateConverter.setPatterns(new String[]{"yyyy-MM-dd"});
// ConvertUtils.register(dateConverter, Date.class);
}
// 项目被取消部署时调用
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 回收资源
System.out.println("contextDestroyed------------------");
}
}
XML:
<!-- 配置Listener -->
<listener>
<listener-class>com.mj.xr.listener.ContextListener</listener-class>
</listener>
参考
李明杰: Java从0到架构师②JavaEE技术基石.
本文完,感谢您的关注支持!