过滤器实际上就是对web资源进行拦截,做⼀些处理后再交给下一个过滤器或servlet处理,通常都是用来拦截request进⾏处理的,也可以对返回的response进行拦截处理。
2.过滤器的语法格式: 1.创建一个类实现Filter接口public class CharSetFilter implements Filter{}2.重写接口中的方法
public void destroy() { //销毁的⽅法} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //过滤⽅法 主要是对request和response进⾏⼀些处理,然后交给下⼀个过滤器或 Servlet处理 chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { }3.在web.xml文件中配置
3.实际应用 1.如何防止用户未登录就执行后续 *** 作过滤器名称 过滤器所在的路径 过滤器名称 需要过滤的资源
String name=(String)session.getAttribute("key"); if(name==null){ //跳转到登录⻚⾯ }2.设置编码方式--统一设置编码 3.加密解密(密码的加密和解密) 4.非法文字筛选 5.下载资源的限制 过滤器的特点:在servlet之前和之后都会被执行 4.代码实现一:单个过滤器 第一步:创建一个过滤器类,实现接口Filter
package util; import javax.servlet.*; import java.io.IOException; public class FirstFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //初始化filter System.out.println("初始化filter"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //请求和响应时都会执行这个方法 System.out.println("过滤器开始过滤"); //调取下一个过滤器方法,获取servlet方法 filterChain.doFilter(servletRequest,servletResponse); System.out.println("过滤器结束过滤"); } @Override public void destroy() { //销毁Filter System.out.println("销毁Filter"); } }第二步:在web.xml文件中配置过滤器
第三步:在登录处理类新增输出语句,并测试程序f1 util.FirstFilter f1 /login
package servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; @WebServlet(urlPatterns = "/login") public class LoginServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("login-servlet被执行"); //接参数 String username = req.getParameter("username"); String pass = req.getParameter("pass"); //写逻辑:判断正误 if ("admin".equals(username)&&"123456".equals(pass)){ //登录成功 //session存值 HttpSession session = req.getSession(); session.setAttribute("username",username); session.setAttribute("psssword",pass); //设置session失效时间 session.setMaxInactiveInterval(60*30);//单位是秒 //重定向或者转发,session数据是不会丢失的,但重定向时,requet中的数据会丢失 resp.sendRedirect("success.jsp"); }else{ //登录失败 //1.后台创建cookie cookie cookie = new cookie("uname",username); //2.返回给前端 resp.addcookie(cookie); resp.sendRedirect("index.jsp"); } } }
测试结果
init方法在第一次登录时执行,之后的登录就不会执行
destory方法在关闭服务器时执行
doFilter方法每次登录时都会执行
5.代码实现二:多个过滤器 第一步:创建第二个过滤器接口
package util; import javax.servlet.*; import java.io.IOException; public class SecondFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //初始化filter System.out.println("初始化2filter"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //请求和响应时都会执行这个方法 System.out.println("过滤器2开始过滤"); //调取下一个过滤器方法,获取servlet方法 filterChain.doFilter(servletRequest,servletResponse); System.out.println("过滤器2结束过滤"); } @Override public void destroy() { //销毁Filter System.out.println("销毁2Filter"); } }2.配置web.xml文件
3.测试结果f2 util.SecondFilter f2 /login
1.服务器启动时
2.登录时
从1开始开始过滤,再逆序返回,执行顺序跟web.xml文件的顺序有关
代码实现三:加入乱码处理package util; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class FirstFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //初始化filter System.out.println("初始化filter"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //请求和响应时都会执行这个方法 System.out.println("过滤器开始过滤"); //处理乱码 *** 作 HttpServletRequest request=(HttpServletRequest)servletRequest; request.setCharacterEncoding("utf-8"); //调取下一个过滤器方法,获取servlet方法 filterChain.doFilter(servletRequest,servletResponse); System.out.println("过滤器结束过滤"); } @Override public void destroy() { //销毁Filter System.out.println("销毁Filter"); } }代码实现四 如何防止用户未登录就执行后续 *** 作
<%@ page contentType="text/html;charset=UTF-8" language="java" %>Title testsession.jsp-只有用户登录以后才能访问本页面 当前登录用户:${sessionScope.username}
package util; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class FirstFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //初始化filter System.out.println("初始化filter"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //请求和响应时都会执行这个方法 System.out.println("过滤器开始过滤"); //处理乱码 *** 作 HttpServletRequest request=(HttpServletRequest)servletRequest; HttpServletResponse response=(HttpServletResponse)servletResponse; request.setCharacterEncoding("utf-8"); //防止用户在未登录的情况下访问资源 String requestURI = request.getRequestURI(); System.out.println("requestURI:"+requestURI); Object username = request.getSession().getAttribute("username"); if (requestURI.endsWith("testsession.jsp")&&username==null){ response.sendRedirect("index.jsp"); } //调取下一个过滤器方法,获取servlet方法 filterChain.doFilter(servletRequest,servletResponse); System.out.println("过滤器结束过滤"); } @Override public void destroy() { //销毁Filter System.out.println("销毁Filter"); } }
测试结果f1 util.FirstFilter f1 /* f2 util.SecondFilter f2 /login
启动服务器时
未登录时直接再地址栏输入testsession.jsp,没有跳转,而是重新回到index.jsp页面
但是在登录之后,将地址栏的success改成,就可以访问了
监听器:Listener
1.什么是监听器 监听器就是监听某个域对象的的状态变化的组件 事件源:被监听的对象 ( 三个域对象 request 、 session 、 servletContext) 监听器:监听事件源对象事件源对象的状态的变化都会触发监听器 注册监听器:将监听器与事件源进行绑定 响应行为:监听器监听到事件源的状态变化时所涉及的功能代码(程序员编写代码) 2.监听器分类 第一维度按照被监听的对象划分: ServletRequest 域、 HttpSession 域、 ServletContext 域 第二维度按照监听的内容分:监听域对象的创建与销毁的、监听域对象的属性变化
3.监听三大域对象的创建与销毁的监听器 监听器的编写步骤(重点): 编写监听器类去实现监听器接口 覆盖监听器的方法 需要在 web.xml 中进行配置 — 注册
ServletContextListener 监听 ServletContext 域的创建与销毁的监听器 Servlet 域的⽣命周期 何时创建:服务器启动创建 何时销毁:服务器关闭销毁 ServletContextListener 监听器的主要作用 初始化的作作:初始化对象、初始化数据(加载数据库驱动、连接池的初始化) 加载这些初始化的配置文件 (spring 的配置文件) 任务调度 ( 定时器 —Timer/TimerTask )监听器所在的路径
HttpSessionListener 监听 Httpsession 域的创建和销毁的监听器 HttpSession 对象的生命周期 何时创建:第一次调⽤ request.getSession 时创建 何时销毁:服务器关闭销毁、 session 过期(默认 30 分钟,修改默认的 30 分钟是在 Tomcat 的 web.xml ,修改当前项目的过期时间是在自己项目的 web.xml 中)、⼿动销毁
HttpSessionListener 监听器的主要作用: 由于每次访问⽹站都会默认创建 session 对象( jsp 页面中 page 指令中的 session 属性默认为 true ,即被访问时创建 session ),可以用于计数⽹站访问过的人数 ServletRequestListener 监听 ServletRequest 域创建与销毁的监听器 ServletRequest 的⽣命周期 创建:每次请求都会创建 request 销毁:请求结束 用法同上,用处不是很大,此处省略。 代码实现
监听session创建与销毁,监听存值与移除数据
package util; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { System.out.println("session创建"); } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { System.out.println("session销毁"); } }
package util; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; public class AttributeListener implements HttpSessionAttributeListener { @Override public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) { System.out.println("session存值,"+httpSessionBindingEvent.getName()+","+httpSessionBindingEvent.getValue()); } @Override public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) { System.out.println("session移除数据"); } @Override public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) { } }测试结果
服务器启动时
登录时
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)