怎么在视频网站做淘宝客,一个小型购物网站开发,软件工程师报考条件,深圳网站建设方案1.简介
在 Java Web 开发中#xff0c;Filter 是一个非常重要的组件#xff0c;用于在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行预处理或后处理。Filter 可以用来实现多种功能#xff0c;如日志记录、权限检查、编码转换、请求头修改等。就好比机场的层层…1.简介
在 Java Web 开发中Filter 是一个非常重要的组件用于在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行预处理或后处理。Filter 可以用来实现多种功能如日志记录、权限检查、编码转换、请求头修改等。就好比机场的层层安检对前来的乘客进行检查过滤携带违规物品未买机票等不满足机场要求的就会被阻止进入。
2.Filter 的工作原理 配置在 web.xml 文件中或使用注解来配置 Filter。 在 web.xml中配置
filter!--设置filter的别名--filter-nameLoggingFilter/filter-name!--filter的字节码路径--filter-classcom.example.LoggingFilter/filter-class
/filterfilter-mapping!--使用filter别名所对应的过滤路径可以有多个--filter-nameLoggingFilter/filter-name!--/*表示对所有路径进行过滤--url-pattern/*/url-pattern!--所要过滤的servlet的别名--servlet-nameservlet1/servlet-name
/filter-mapping使用注解WebFilter,它有如下几个常用的值
filterName filter的别名相当于标签urlPatterns所要过滤的资源url相当于标签ServletNames所要过滤的servlet别名相当于 servletNames
WebFilter(filterName loggingFilter,urlPatterns {/servlet1,*.html},servletNames {servlet1,Servlet2}
)拦截当请求到达时Filter 会拦截请求并执行预处理逻辑。 在请求到达目标资源前所执行的一些操作如检查用户是否有权限访问记录、请求和响应的信息 放行Filter 可以选择是否放行请求到目标资源如 Servlet。此时会执行FilterChain的doFilter方法代表放行。 FilterChain表示Filter链若对于该资源后续还有其他Filter要进行过滤此时的doFilter方法就会转而执行其他的Filter若此时没有Filter要进行过滤那么便会放行进行目标资源的处理如servlet 后处理在目标资源如 Servlet处理完请求后Filter 可以对响应进行后处理。
3.Filter的生命周期
包括初创建、始化、过滤和销毁四个阶段。
阶段对应方法执行时机执行次数创建对象构造器web应用启动时1次初始化方法void init(FilterConfig filterConfig)构造完毕1次过滤请求void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)每次请求多次销毁default void destroy()web应用关闭时1次
特别注意的的时Filter在web应用启动时就创建了并且进行初始化这个过程只会出现一次。
4.Filter的执行顺序
一个web项目中,可以同时定义多个过滤器,当多个过滤器对同一个资源进行过滤时,工作位置有先后,整体形成一个工作链,称之为过滤器链FilterChain 当使用配置文件进行配置时 过滤器链中的过滤器的顺序由filter-mapping标签的定义顺序决定 当使用注解的方式进行配置时 通常会把全部的过滤器放在一个包下此时执行顺序为类名的字典排序由小到大依次执行
5.一个简单的Filter的示例
案例要求当用户访问资源时检查其是否进行登陆若未登录则跳转到登录页 若以登录则放行
WebFilter(/*)
public class CheckLoginFilter implements Filter {Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {//向下转型实现重定向获得session等功能HttpServletRequest httpRequest (HttpServletRequest) request;HttpServletResponse httpResponse (HttpServletResponse) response;// 检查用户是否已登录String user (String) httpRequest.getSession().getAttribute(username);if (user null) {// 用户未登录重定向到登录页面httpResponse.sendRedirect(httpRequest.getContextPath() /login);} else {// 用户已登录放行请求注意是调用的FilterChain中的doFilter方法chain.doFilter(request, response);}}
}