过滤器
2019-06-11 本文已影响0人
某某宝
1、介绍
1)、Filter
Filter 即为过滤,用于在 Servlet 之外对 Request 或者 Response 进行修改。 它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。
2)、使用 Filter 的完整流程
Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再 对服务器响应进行后处理。
3)、 Filter 链
在一个 web 应 用中,可以开发编写多个 Filter,这些 Filter 组合 起来称之为一个 Filter 链。
若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时: 以相反的 顺序执行。
4)、原理
在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。 根据需要检查 HttpServletRequest,也可以修改 HttpServletRequest 头和数据。
在 HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据 需要检查 HttpServletResponse,也可以修改 HttpServletResponse 头和数据。
2、实现
我们可以通过实现一个叫做 javax.servlet.Fileter 的接口来实现一个过滤器, 其中定义了 三个方法,init(), doFilter(), destroy()分别在相应的时机执行。后期观 察生命周期。 Filter 的实现只需要两步:
Step1: 编写 java 类实现 Filter 接口,并实现其 doFilter 方法。
Step2: 在 web.xml 文件中对编写的 filter 类进行注册,并设置它所能拦截 的资源。
public class Filter01 implements Filter {
/**
* 初始化方法,只执行一次
* 服务器启动即初始化
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("拦截处理");
//放行
chain.doFilter(request, response);
System.out.println("拦截结束");
}
/**
* 销毁方法
*/
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
<filter>
<filter-name>filter01</filter-name>
<filter-class>com.czb.filter.Filter01</filter-class>
</filter>
<filter-mapping>
<filter-name>filter01</filter-name>
<url-pattern>/download</url-pattern><!-- 需要拦截的路径,也可以同时配置多个,通常设置为 /* -->
</filter-mapping>
3、非法访问拦截
静态资源 css、js、images等 (statics目录下的资源,都放行)
放行指定页面 login登录 (不需要登录即可访问的页面,都要放行)
放行执行操作 登录操作 (不需要登录即可执行的操作,都放行,登录、注册等)
登录状态 放行 (登录成功后将用户信息存到session域对象中,如果域对象中的值不为空,则为登录状态;否则,为非登录状态)
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 得到当前的路径
String url = request.getRequestURI();
System.out.println(url);
// 1、静态资源 css、js、images等 (statics目录下的资源,都放行)
if (url.contains("/statics")) {
// 放行
chain.doFilter(request, response);
return;
}
//2登录页面
if (url.contains("LoginAjax.html")) {
chain.doFilter(request, response);
return;
}
// 3、放行执行操作 登录操作 (不需要登录即可执行的操作,都放行,登录、注册等)
// 得到用户行为
String actionName = request.getParameter("actionName");
if (url.contains("/servlet01")) { // 确认模块
// 确认用户行为
// if ("form".equals(actionName)) {
// 放行
chain.doFilter(request, response);
return;
// }
}
// 4、登录状态 放行 (登录成功后将用户信息存到session域对象中,如果域对象中的值不为空,则为登录状态;否则,为非登录状态)
// 获取session域对象的值
User user = (User) request.getSession().getAttribute("user");
if (user != null) {
// 放行
chain.doFilter(request, response);
return;
}
response.sendRedirect("LoginAjax.html");
return;
}