过滤器Filter

什么是Filter?
它使用户可以改变一个request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,filter其实是一个“servlet chaining“(servlet 链).
在请求到servlet前对请求进行处理,在响应离开时对响应进行处理

为什么要使用Filter?
举例说明:
①在servlet中service方法中每次都要设置编码
req.setCharacterEncoding(“UTF-8”);
在请求到达servlet之前就对编码进行设置
②没有过滤器时,当我们访问一个资源—>/product,可以直接进入页面,但是这种界面应该是需要用户登录后才能看得见的,所以需要对用户的请求进行处理,判断是否登录
,不应该随意被访问的资源应该进行判断
怎么使用Filter?
1.新建一个类xxxFilter 实现 javax.servlet.filter接口
2.复写其中的3个方法

destroy();
doFilter(){
    //设置编码
		 //处理硬编码,将"UTF-8"配置成初始化参数
			req.setCharacterEncoding(encoding);
			//放行
			chain.doFilter(req, res);
}


init(){
    encoding=config.getInitParameter("encoding");
}

3.将filter交给tomcat管理

<filter>
		<filter-name>character</filter-name>
		<filter-class>com.pmis.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>character</filter-name>
          <!--对所有资源都使用该编码-->
		<url-pattern>/*</url-pattern>
	</filter-mapping>

验证登录:—>只有用户登录过后才可以访问受保护的资源,否则跳转至登录界面
1.新建一个CheckLoginFilter实现javax.servlet.filter接口并复写接口中的方法
2.判断是否登录根据登录时存入session中的用户数据进行判断,如果数据为空则表示没有登录,重定向到登录界面
对请求的处理应当加上判断:判断当前请求的资源是否为登录界面资源(/login.jsp或者/login),如果是就直接放行,对与登录的相关资源不用进行验证
① 对不用验证的资源添加到配置文件中,避免硬编码

<filter>
		<filter-name>checklogin</filter-name>
		<filter-class>com.pmis.web.filter.CheckLoginFilter</filter-class>
		<init-param>
			<param-name>unCheckedURIs</param-name>
           <!--不用验证的资源-->
			<param-value>/login.jsp,/login</param-value>
		</init-param>
	</filter>

②处理初始化资源
将不需要验证的资源的名称用list集合封装
list集合有contains方法

private List<String> unCheckedURIs;

public void init(FilterConfig config) throws ServletException {
		String initParameter = config.getInitParameter("unCheckedURIs");
		String[] split = initParameter.split(",");
		unCheckedURIs = Arrays.asList(split);

	}

③对当前请求进行判断,是否属于不用验证的资源

       String requestURI = req.getRequestURI();
		// 如果访问的资是login.jsp或者是/login-->直接放行
		// login.jsp,/login 写死属于硬编码,将不需要检查的资源添加到配置文件中init-param 中
		if (!unCheckedURIs.contains(requestURI))//如果当前请求不属于不需要验证的资源就需要进行判断
              //取出session中的数据
			Object currentUser = req.getSession().getAttribute("USER_IN_SESSION");
			//判断是否为空,为空表示没有登录
			if (currentUser == null) {
				res.sendRedirect("/login.jsp");
				return;
			}
		}
  //属于不需要验证的资源就直接放行
		chain.doFilter(req, res);

④ response对象是 ServletResponse类型,需要调用重定向方法,只有HttpServletResponse对象有该方法,所以需要强转

HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

⑤当前受保护的资源只有 priduct,所以url-pattern写product,不能写/*,会将验证码,css,js等资源一并拦截

 <filter-mapping>
	<filter-name>checklogin</filter-name>
	<url-pattern>/product</url-pattern>
	</filter-mapping>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值