过滤器Filter

    过滤器时JavaWeb三大组件之一,它与Servlet很相似。不过过滤器是用来拦截请求的,而不是处理请求的。

    当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter放行,则会执行用户请求的Servlet;如果Filter不放行,那么就不会执行用户请求的Servlet。

    1、过滤器的生命周期

        a、init:在服务器启动时创建Filter实例,并且是单例的。创建之后调用init方法完成初始化。

        b、doFilter:这个方法会在用户访问配置的过滤路径时执行,如果需要放行,那么调用doFilter方法放行请求,不然过滤掉此请求。

        c、destory:在服务器关闭时,服务器调用destory方法,然后销毁Filter对象。

    2、FilterChain

        我们可以在一个目标资源上,可以部署多个过滤器,只有当这个过滤器链都放行,才能访问目标资源。如果当前过滤器时最后一个过滤器,那么调用chain.doFilter()方法表示执行目标资源,如果不是最后一个过滤器,那么chain.doFilter()表示执行下一个过滤器的doFilter()方法。

    3、多个过滤器的执行顺序

        一个目标资源可以指定多个过滤器,过滤器的执行顺序是在web.xml文件中的部署顺序。

    4、过滤器的拦截方式

        过滤器有四种拦截方式。分别是:REQUEST,FORWARD,INCLUDE,ERROR

        REQUEST:直接访问目标资源时执行过滤器。包括:地址栏直接访问、表单提交、超链接、重定向。

        FORWARD:转发访问执行过滤器。包括RequestDispathch.forward()方法、<jsp:forward>标签

        INCLUDE:包含访问执行过滤器。包括RequestDispathcher.include()方法,<jsp:include>标签

        ERROR:当目标资源在web.xml配置为<error-page>时,并且出现了异常,转发到目标资源时,执行过滤器

    5、过滤器的应用场景

        比如设置编码、检验用户是否登录,后续处理等等

    设置编码的过滤器

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

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

public class EncodingFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		//1.强转
		HttpServletRequest request=(HttpServletRequest) req;
		HttpServletResponse response=(HttpServletResponse) resp;
		
		//2.放行
		chain.doFilter(new MyRequest(request), response);
	}

	@Override
	public void destroy() {
	}

}
class MyRequest extends HttpServletRequestWrapper{
	private HttpServletRequest request;
	private boolean flag=true;
	
	
	public MyRequest(HttpServletRequest request) {
		super(request);
		this.request=request;
	}
	
	@Override
	public String getParameter(String name) {  
		if(name==null || name.trim().length()==0){
			return null;
		}
		String[] values = getParameterValues(name);
		if(values==null || values.length==0){
			return null;
		}
		
		return values[0];
	}
	
	@Override
	public String[] getParameterValues(String name) {
		if(name==null || name.trim().length()==0){
			return null;
		}
		Map<String, String[]> map = getParameterMap();
		if(map==null || map.size()==0){
			return null;
		}
		
		return map.get(name);
	}
	
	@Override
	public Map<String,String[]> getParameterMap() {  
		
		/**
		 * 首先判断请求方式
		 * 若为post  request.setchar...(utf-8)
		 * 若为get 将map中的值遍历编码就可以了
		 */
		String method = request.getMethod();
		if("post".equalsIgnoreCase(method)){
			try {
				request.setCharacterEncoding("utf-8");
				return request.getParameterMap();
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else if("get".equalsIgnoreCase(method)){
			Map<String,String[]> map = request.getParameterMap();
			if(flag){
				for (String key:map.keySet()) {
					String[] arr = map.get(key);
					//继续遍历数组
					for(int i=0;i<arr.length;i++){
						//编码
						try {
							arr[i]=new String(arr[i].getBytes("iso8859-1"),"utf-8");
						} catch (UnsupportedEncodingException e) {
							e.printStackTrace();
						}
					}
				}
				flag=false;
			}
			//需要遍历map 修改value的每一个数据的编码
			
			return map;
		}
		return super.getParameterMap();
	}
}

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript的过滤器filter是用于数组的方法,可以根据指定的条件筛选出符合条件的元素,并返回一个新的数组。这个方法接受一个回调函数作为参数,回调函数可以接受三个参数:值、索引和数组本身。通过在回调函数中定义筛选条件,可以实现对数组的过滤操作。 例如,我们可以使用filter方法来筛选出一个数组中大于2的元素: ``` let arr = [1, 2, 3, 4, 5]; let filteredArr = arr.filter(function(value, index, arr) { return value > 2; }); console.log(filteredArr); // 输出 [3, 4, 5] ``` 在这个例子中,回调函数通过判断值是否大于2来决定是否保留该元素。filter方法会返回一个新的数组,其中只包含满足条件的元素。 除了使用匿名函数作为回调函数,我们还可以使用箭头函数来简化代码: ``` let arr = [1, 2, 3, 4, 5]; let filteredArr = arr.filter(value => value > 2); console.log(filteredArr); // 输出 [3, 4, 5] ``` 通过使用filter方法,我们可以方便地对数组进行筛选操作,从而得到我们想要的结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue 过滤器filter实例详解](https://download.csdn.net/download/weixin_38743084/13980656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [js过滤器filter的使用](https://blog.csdn.net/qq_60358807/article/details/122022883)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值