版权声明:该版权归博主个人所有,在非商用的前提下可自由使用,转载请注明出处. https://blog.csdn.net/qq_24696571/article/details/89928627
过滤器
- 对服务器的资源进行管理和过滤 , 例如在servlet中需要设置响应和请求的编码格式 , 如果每个servlet都要写一遍就会产生大量的代码冗余 . 这样的时候我们可以考虑使用过滤器 ,又例如敏感词汇过滤等 .
- 过滤器进行过滤时 , 浏览器请求服务器时会被过滤 . 服务器收到请求响应浏览器时也会进行过滤 .
- 过滤器使用的场景例如: 统一编码格式, 权限管理 , 资源管理(统一水印和和谐词汇等) , session管理(session失效时会创建新的sessionID,但无数据的情况 , 我们可以用过滤器判断session是否失效)
过滤器的使用
- 实现Filter接口 , 并覆写接口的方法:
- init: 服务器启动初始化
- doFilter:过滤逻辑书写的方法 ;
- destory:服务器关闭销毁
package com.credi;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
}
@Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
- web.xml配置过滤器
<filter>
<filter-name>filter</filter-name>
<filter-class>com.credi.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern><!--/*:拦截所有 ; *.do:拦截url以'.do'结尾的所有servlet ; /xxx : 针对某个具体的servlet-->
</filter-mapping>
- 编码格式和session管理的示例
package com.credi;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class MyFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//session管理
//将ServletRequest对象转为HttpServletRequest , 然后获取session对象
HttpSession session = ((HttpServletRequest)request).getSession();
//判断session是否为空
if(session.getAttribute("user")==null){
//如果为空就重定向登陆页
((HttpServletResponse)response).sendRedirect("/Project/Login.jsp");
}else{
//session没有过期就放行
chain.doFilter(request, response);
}
}
@Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
监听器
- 监听器用于监听作用域对象属性的创建,改变和销毁
- 监听对象:request , session , application
监听器的使用
- 实现的接口和覆盖的方法
- web.xml配置
<!-- 监听器 -->
<listener>
<listener-class>com.credi.MyListener</listener-class>
</listener>
- 监听器监听三大作用域对象的操作示例:
package com.credi;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyListener implements ServletRequestListener,ServletRequestAttributeListener,HttpSessionListener,HttpSessionAttributeListener,ServletContextListener,ServletContextAttributeListener{
// 1 . request作用域对象数据的监听
//销毁
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request作用域对象销毁");
}
//创建
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request作用域对象创建");
}
//添加
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
// .getName():添加数据的键 , .getValue():添加数据的值
System.out.println(srae.getName()+srae.getValue());
}
//删除
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
// .getName():删除数据的键 , .getValue():删除数据的值
System.out.println(srae.getName()+srae.getValue());
}
//改变
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
// .getName():改变的数据的键 , .getValue():改变的数据的值
}
/*===================================================================================*/
// 2. session作用域对象的监听
//创建
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
// 销毁
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
// 添加
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
}
// 删除
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
}
// 修改
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
}
/*===================================================================================*/
// 3 . application(ServletContext)对象的监听
// 创建
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
// 销毁
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
// 添加
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
}
// 删除
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
}
// 修改
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
}
}
- 使用监听器统计在线人数:
package com.credi;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class Number implements ServletContextListener,HttpSessionListener{
//服务器启动时在application作用域创建数据
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
servletContext.setAttribute("count", 0);
System.out.println("服务器启动:"+servletContext.getAttribute("count"));
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
// 用户登陆,application的数据增加
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext servletContext = se.getSession().getServletContext();
int count = (int)servletContext.getAttribute("count");
servletContext.setAttribute("count", ++count);
System.out.println("有用户登陆:"+servletContext.getAttribute("count"));
}
// 用户销毁,application的数据自减
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext servletContext = se.getSession().getServletContext();
int count = (int)servletContext.getAttribute("count");
servletContext.setAttribute("count", --count);
}
}