javaWeb工程之Filter简单学习

本文介绍了JavaWeb中的Filter,它用于执行过滤任务,可以在请求和响应中添加额外功能,如字符集设置、用户身份验证、图片压缩和日志处理。使用Filter可以减少重复代码,便于项目管理和维护。文中还探讨了Filter接口以及如何通过Filter实现用户登录验证的过滤操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Filter:过滤器
    1. filter是一个执行过滤任务的组件,它可以过滤客户端的请求和从服务端返回的响应;
    2. 每一个filter都可以在请求前和响应后增加额外的功能;
      1. 可以对字符集的统一设置
      2. 完成对用户的身份验证
      3. 统一的图片压缩
      4. 日志处理
    3. 使用Filter的好处;
      1. 避免了一些重复的代码,大大减少了代码量
      2. 实现了一些操作的统一管理
      3. 更有利于项目的开发与维护
  • Filter接口:javax.servlet Interface Filter
    1. 提供的方法
      1. void    destroy();//销毁Filter(由web容器决定)
      2. void    doFilter(ServletRequest request,ServletResponse,FilterChain chain);//过滤的具体方法
      3. void    inite(FilterConfig  filterConfig);//初始化方法
    2. 开发步骤:
      1. 实现Filter接口
      2. 重写doFilter()方法
  • 关于Filter的过滤规则配置的方法
    1. 使用Annotation注解@WebFilter()
      @WebFilter({ "*.html", "*.jsp", "*.do" })
    2.  <filter>
        	<filter-name>checkedFilter</filter-name>
        	<filter-class>com.oracle.filter.LoginCheckedFilter</filter-class>
        </filter>
        <filter-mapping>
        	<filter-name>checkedFilter</filter-name>
        	<url-pattern>*.jsp</url-pattern>
        </filter-mapping>
        <filter-mapping>
        	<filter-name>checkedFilter</filter-name>
        	<url-pattern>*.html</url-pattern>
        </filter-mapping>
        <filter-mapping>
        	<filter-name>checkedFilter</filter-name>
        	<url-pattern>*.do</url-pattern>
        </filter-mapping>
      多个过滤的url,需要设置多个filter-mapping
  • 通过Filter实现用户登录的验证及过滤操作
package com.oracle.filter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet Filter implementation class LoginCheckedFileter
 */
@WebFilter({ "*.html", "*.jsp", "*.do" })
public class LoginCheckedFileter implements Filter {
	
	List<String>  list=new ArrayList<>();
 
    /**
     * Default constructor. 
     */
    public LoginCheckedFileter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

		//类型转换
		HttpServletRequest req=(HttpServletRequest)request;
		HttpServletResponse res=(HttpServletResponse)response;
		
		//对所有请求响应设置字符集
		req.setCharacterEncoding("utf-8");
		res.setCharacterEncoding("utf-8");
		
		//获得请求地址
		String uri=req.getRequestURI();
		//获得请求路径
		String path=req.getContextPath();
//		System.out.println(path);
//		System.out.println(uri);
//		System.out.println("-------"+uri.replaceAll(path, ""));
		//获得登录的标记
		HttpSession session=req.getSession();
		//登录标记不存在,跳转到登录界面
		if(session.getAttribute("emp")!=null){
			
			//放行,满足登录条件
			chain.doFilter(request, response);
			
			
		}else if(list.contains(uri.replaceAll(path, ""))){
			//满足放行的uri
			chain.doFilter(request, response);
		}else{
			
			//此方法会重定向到相对当此请求路径下的login.jsp,不满足放行条件,会进入无限循环
			//res.sendRedirect("login.jsp");
			
			
			//重定向到本工程根目录下的login.jsp,该方法在登录超时(session过期之后)
			//,在进行某些操作时,由于指定了页面的打开位置,会导致登录页面不是覆盖整个浏览器
			//res.sendRedirect(path+"/login.jsp");
			
			res.getWriter().println("<script>window.top.location.href='"+path+"/login.jsp'</script>");
		}
		
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {

		//添加放行的uri
		list.add("/login.jsp");
		list.add("/empLogin.do");
			
	
	}

}
*在页面跳转时需要注意的地方:
  1. 放行的uri使用的相对地址,便于工程以后的维护及修改(如修改工程名)
  2. 跳转时使用的是path(工程路径名)+uri(跳转页面),避免了相对路径下始终不满足放行条件,发生无限循环重定向
    1. FireFox提示
    2. Google  Chrome提示
  3. 当登录超时再进行操作跳转到登录页,如果之前登陆过,默写特定网页指定了打开位置,会导致登录页不能覆盖整个浏览器
    res.getWriter().println("<script>window.top.location.href='"+path+"/login.jsp'</script>");
    使用js强制将页面打开位置设置为整个窗口的上方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值