Javaweb学习(四)之Filter过滤器 , 监听器
1、Filter
1.1、什么是Filter过滤器
- Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
- Filter 过滤器它是 JavaEE 的规范。也就是接口
- Filter 过滤器它的作用是:拦截请求,过滤响应
拦截请求常见的应用场景有:
- 权限检查
- 日记操作
- 事务管理
- 处理中文乱码
- 登录验证….
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hy1v1lOn-1595424769258)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20200722204715105.png)]
1.2、Filter 的使用
Filtet代码
//继承Filter接口
public class CharacterEndoingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEndoingFilter开始初始化呢");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//解决乱码问题
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
System.out.println("CharacterEndoingFilter方法开始前");
//doFilter方法必须写,让我们的请求继续往下访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("CharacterEndoingFilter方法开始后");
}
public void destroy() {
System.out.println("CharacterEndoingFilter方法被销毁呢");
}
}
Servlet代码(因为在Filter过滤器中编写了解决中文乱码的问题 所以在 servlet代码中就不需要写呢! 这样使我们方便了许多 )
public class FilteServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("宋超");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>filteServlet</servlet-name>
<servlet-class>com.song.servlet.FilteServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>filteServlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>filteServlet1</servlet-name>
<servlet-class>com.song.servlet.FilteServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>filteServlet1</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<filter>
<filter-name>ShowFilter</filter-name>
<filter-class>com.song.filter.CharacterEndoingFilter</filter-class>
</filter>
<!--只要是 /servlet的任何请求,都会经过这个过滤器 可以自己设置路径来过滤-->
<filter-mapping>
<filter-name>ShowFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
</web-app>
Filter 过滤器的使用步骤:
1、编写一个类去实现 Filter 接口
2、实现过滤方法 doFilter()
3、到 web.xml 中去配置 Filter 的拦截路径
Filter 的拦截路径 -
-
-精确匹配
<url-pattern>/target.jsp</url-pattern>
/target.jsp 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
-
–目录匹配
<url-pattern>/admin/*</url-pattern>
/admin/* 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*
-
–后缀名匹配
<url-pattern>*.html</url-pattern>
*.html 以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
<url-pattern>*.do</url-pattern>
*.do 以上配置的路径,表示请求地址必须以.do 结尾才会拦截到
<url-pattern>*.action </url-pattern>
*.action 以上配置的路径,表示请求地址必须以.action 结尾才会拦截到 Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!
2、监听器(可以只了解就行)
2.1、什么是监听器
监听器就是监听观察某个事件(程序)的发生情况,当被监听的事件真的发生了的时候,事件发生者(事件源) 就会给注册该事件的监听者(监听器)发送消息,告诉监听者某些信息,同时监听者也可以获得一份事件对象,根据这个对象可以获得相关属性和执行相关操作。
2.2、编写一个监听器
//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {
//创建session监听: 看你的一举一动
//一旦创建Session就会触发一次这个事件!
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
System.out.println(se.getSession().getId());
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount = new Integer(1);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count+1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
//销毁session监听
//一旦销毁Session就会触发一次这个事件!
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount = new Integer(0);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count-1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
/*
Session销毁:
1. 手动销毁 getSession().invalidate();
2. 自动销毁
*/
}
配置web.xml
<!--注册监听器-->
<listener>
<listener-class>com.kuang.listener.OnlineCountListener</listener-class>
</listener>
1. 手动销毁 getSession().invalidate();
2. 自动销毁
*/
}
配置web.xml
```xml
<!--注册监听器-->
<listener>
<listener-class>com.kuang.listener.OnlineCountListener</listener-class>
</listener>
推荐学习javaweb视频 B站:遇见狂神说 若写的有问题 欢迎纠正哦! 谢谢大家!