zoukankan      html  css  js  c++  java
  • Web阶段:第十八章:Filter过滤器

    Filter,什么是过滤器?
    1.Filter过滤器是javaWeb的三大组件之一,
    2.三大组件分别是:Servlet程序,Filter过滤器,Listener监听器。
    3.Filter是接口。
    4.Filter的作用是:拦截请求,过滤响应。

    Filter的初体验
    需求:在webContent目录下有一个admin目录。然后在这个目录下有html页面,jsp页面,jpg图片。
    要求这个目录下所有的资源都必须登录之后才能访问。

    我们可以在jsp页面中,通过判断,Session域中是否包含用户登录的信息。
    如果Session有用户登录的信息,说明已经登录,允许访问。返回,则让页面跳转到登录页面。
    在这里插入图片描述

    <%
    	Object user = session.getAttribute("user");
    	// 用户没登录
    	if (user == null) {
    		request.getRequestDispatcher("/login.jsp").forward(request, response);
    		return;
    	}
    %>
    

    如何使用Filter来保持Admin下的资源,在登录之后才允许访问。

    Filter的使用步骤:
    1、编写一个类去实现Filter接口
    2、实现doFilter拦截的方法。
    3、到web.xml中去配置拦截的资源地址

    AdminFilter的代码:

    public class AdminFilter implements Filter {
    	/**
    	 * doFilter方法在每次拦截到请求之后就会调用
    	 */
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response,
    			FilterChain chain) throws IOException, ServletException {
    		HttpServletRequest httpRequest = (HttpServletRequest) request;
    		
    		//做拦截检查的工作
    		Object user = httpRequest.getSession().getAttribute("user");
    		// 用户没登录
    		if (user == null) {
    			request.getRequestDispatcher("/login.jsp").forward(request, response);
    			return;
    		} else {
    			// 已经登录
    			chain.doFilter(request, response);
    		}
    	}
    }
    

    web.xml中的配置:

    <!-- Filter标签 配置Filter过滤器 -->
    <filter>
    	<filter-name>AdminFilter</filter-name>
    	<filter-class>com.atguigu.filter.AdminFilter</filter-class>
    </filter>
    <filter-mapping>
    	<filter-name>AdminFilter</filter-name>
    	<!-- 
    		/admin/* 表示 http://ip:port/工程名/admin/* 全部资源
    	 -->
    	<url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    

    login.jsp页面

    <body>
    	<form action="${ pageContext.request.contextPath }/loginServlet" method="post">
    		用户名:<input type="text" name="username" /><br/>
    		密码:<input type="password" name="password"/><br/>
    		<input type="submit" />
    	</form>
    </body>
    

    LoginServlet程序

    public class LoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doPost(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		String username = request.getParameter("username");
    		String password = request.getParameter("password");
    		
    		if ("wzg168".equals(username) && "123456".equals(password)) {
    			request.getSession().setAttribute("user", username);
    			System.out.println("登录成功!");
    		} else {
    			System.out.println("登录失败!");
    		}
    	}
    }
    

    Filter的生命周期

    1、Filter的构造器方法
    2、执行init初始化操作
    3、执行doFilter过滤方法		每次拦截都会执行
    4、执行destroy销毁方法
    

    FilterConfig 类
    FilterConfig类封装了Filter过滤器的配置信息。

    作用:
    1、获取filter-name的值 过滤器的别名
    2、获取init-param初始化参数
    3、获取ServletContext对象

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    	// TODO Auto-generated method stub
    	// System.out.println("2、init");
    	// 作用:
    	// 1、获取filter-name的值 过滤器的别名
    	System.out.println("Filter的名称:" + filterConfig.getFilterName());
    	// 2、获取init-param初始化参数
    	System.out.println("Filter的初始化参数url值是:"
    			+ filterConfig.getInitParameter("url"));
    	// 3、获取ServletContext对象
    	System.out.println( filterConfig.getServletContext() );
    }
    

    web.xml中的配置信息:

      <filter>
        <filter-name>AdminFilter</filter-name>
        <filter-class>com.atguigu.filter.AdminFilter</filter-class>
        <init-param>
        	<param-name>url</param-name>
        	<param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>AdminFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
      </filter-mapping>
    

    FilterChain 过滤器链
    Filter 过滤器
    Chain 链条
    FilterChain 过滤器链
    在这里插入图片描述
    Filter1

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
    		FilterChain chain) throws IOException, ServletException {
    
    	System.out.println("Filter1 前置代码");
    	System.out.println("Filter1中获取请求参数:" + request.getParameter("username"));
    	System.out.println("Filter1 当前线程 ==>> " + Thread.currentThread().getName() );
    	chain.doFilter(request, response);
    	System.out.println("Filter1 后置代码");
    	
    }
    

    Filter2

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
    		FilterChain chain) throws IOException, ServletException {
    
    	System.out.println("Filter2 前置代码");
    	System.out.println("Filter2中获取请求参数:" + request.getParameter("username"));
    	System.out.println("Filter2 当前线程 ==>> " + Thread.currentThread().getName() );
    	chain.doFilter(request, response);
    	System.out.println("Filter2 后置代码");
    	
    }
    

    target.jsp页面

    <body>
    	<%
    		System.out.println("target.jsp执行……");
    		System.out.println("target.jsp页面中获取请求参数:" + request.getParameter("username"));
    		System.out.println("target.jsp 当前线程 ==>> " + Thread.currentThread().getName() );
    	%>
    </body>
    

    Filter的拦截路径

    --精确匹配
    <url-pattern>/target.jsp</url-pattern>
    以上的拦截地址,只有当用户请求地址为:http://ip:port/工程名/target.jsp的时候,Filter就会执行。
    
    
    --目录匹配
    <url-pattern>/admin/*</url-pattern>
    以上的拦截地址,只有当用户请求地址为:http://ip:port/工程名/admin/下所有资源,的时候就会执行Filter
    

    –后缀名匹配

    <url-pattern>*.jsp</url-pattern>
    以上的拦截地址。表示只要用户访问的地址是以.jsp结尾,就会拦截。
    <url-pattern>*.html</url-pattern>
    以上的拦截地址。表示只要用户访问的地址是以.html结尾,就会拦截。
    <url-pattern>*.do</url-pattern>
    以上的拦截地址。表示只要用户访问的地址是以.do结尾,就会拦截。
    <url-pattern>*.action</url-pattern>
    以上的拦截地址。表示只要用户访问的地址是以.action结尾,就会拦截。
    

    对于Filter过滤器来说,只要请求的地址匹配上。就会执行Filter过滤器。
    它不关心请求的资源是否存在!

  • 相关阅读:
    AIO5岗位桌面主页【我的收藏夹】只显示8行,怎样增加显示行?
    已设置了参考编号的编码规则定义,但是新增单据的时候,没有出来自动编号是什么原因?
    10个TWaver 网页3D可视化精彩案例
    HTML5大数据可视化效果(二)可交互地铁线路图
    无插件纯web 3D机房 (第四季:大型园区、地球仪效果和其他扩展应用)
    一款基于HTML5的Web 3D开发工具
    Legolas工业自动化平台入门(三)交互事件响应动作
    Legolas工业自动化平台入门(二)数据响应动作
    Legolas工业自动化平台入门(一)搭建应用
    Legolas工业自动化平台案例 —— 水源地自动化监控系统
  • 原文地址:https://www.cnblogs.com/javawxid/p/12812101.html
Copyright © 2011-2022 走看看