什么是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>