过滤器基础
相关代码演示
package cn.servlet.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class FirstFilter implements Filter {
/**
* 过滤器的使用:
* 作用:对服务器接受的请求资源和响应给浏览器的资源进行管理
* 保护servlet
* 使用:创建一个实现了Filter借口的普通java类
* 复写借口的方法:
* init:服务器开启执行
* doFilter:拦截请求方法,在此方法中可以对资源进行管理
* 注意:需要手动对请求进行放行:
* filterChain.doFilter(servletRequest,servletResponse);
* destroy:服务器关闭执行
* 配置web.xml文件:
* <filter>
* <filter-name>myfirst</filter-name>
* <filter-class>cn.servlet.filter.FirstFilter</filter-class>
* </filter>
* <filter-mapping>
* <filter-name>myfirst</filter-name>
* <url-pattern>/*</url-pattern>
* </filter-mapping>
* 注意:/*:表示拦截所有
* 过滤器的生命周期:服务器启动到关闭
* 总结:
* 程序员声明和配置过滤器,服务器根据请求中的uri信息调用
* 执行:浏览器发起请求到服务器,服务器接收到请求后,根据uri信息在web.xml中找到对应的过滤器执行
* doFilter方法,该方法对此次请求处理后,如果符合要求则放行,放行后如果还有符合要求的过滤器则继续
* 进行过滤,找到执行对应的servlet进行请求处理,servlet对请求处理后,也就service方法结束了,还
* 继续返回相应的doFilter方法继续执行。
*
* 案例:
* 统一编码格式
* session管理
* 权限管理
* 资源管理
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter初始化:");
}
@Override
public void destroy() {
System.out.println("filter销毁了!");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter被执行了!");
// 设置编码
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
//判断session
HttpSession httpSession = ((HttpServletRequest)servletRequest).getSession();
if (httpSession.getAttribute("user") == null){
((HttpServletResponse)servletResponse).sendRedirect("loginpractice.jsp");
}else {
filterChain.doFilter(servletRequest,servletResponse);
}
}
}
监听器基础
相关代码演示
package cn.servlet.listenr;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/**
* 监听器的学习:
* 作用:监听作用域对象request,session和application的创建、销毁和内容的改变
* 使用:创建一个实现了指定接口的Java类
* 监听request:
* 监听request对象的创建和销毁:ServletRequestListener
* requestDestroyed(ServletRequestEvent sre) //销毁
* requestInitialized(ServletRequestEvent sre) //创建
* 监听request对象的:ServletContextAttributeListener
* attributeAdded(ServletContextAttributeEvent scae)
* attributeRemoved(ServletContextAttributeEvent scae)
* attributeReplaced(ServletContextAttributeEvent scae)
* 获取数据:scae.getName()
* scae.getValue()
*
* 在web.xml中配置监听器:
* <listener>
* <listener-class>cn.servlet.listenr.FirstListener</listener-class>
* </listener>
*/
public class FirstListener implements ServletRequestListener, ServletContextAttributeListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request对象被销毁!"+sre.getServletRequest());
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request创建了!"+sre.getServletRequest());
}
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("request增加了一条数据:"+scae.getName()+" "+scae.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("request减少了一条数据:"+scae.getName()+" "+scae.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("request修改了一条数据:"+scae.getName()+" "+scae.getValue());
}
}
总结
过滤器和监听器都是保护servlet的组件。