javaWeb工程之Filter简单学习

  • 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.  
        	checkedFilter
        	com.oracle.filter.LoginCheckedFilter
        
        
        	checkedFilter
        	*.jsp
        
        
        	checkedFilter
        	*.html
        
        
        	checkedFilter
        	*.do
        
      多个过滤的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  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("");
		}
		
	}

	/**
	 * @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提示javaWeb工程之Filter简单学习_第1张图片
    2. Google  Chrome提示javaWeb工程之Filter简单学习_第2张图片
  3. 当登录超时再进行操作跳转到登录页,如果之前登陆过,默写特定网页指定了打开位置,会导致登录页不能覆盖整个浏览器
    res.getWriter().println("");
    使用js强制将页面打开位置设置为整个窗口的上方

你可能感兴趣的:(javaEE)