过滤器的简介
01为什么使用过滤器?
我们目前书写项目中遇到的问题?
A、目前使用的baseServlet的优点就是方便可以进行乱码的统一的处理,但是如果我们以后不使用servlet,那么我们在进行中文乱码处理的时候就需要在每一个servlet 中去书写,但是比较麻烦。
B、在进行登陆拦截处理的时候,我们需要把拦截的代码在每一个页面中重复的书写,这样,就会变的非常的麻烦。
最终的问题: 重复的代码在项目中多次的使用书写。
解决方案: 过滤器
02什么是过滤器?
使用过滤器进行乱码解决
Class文件
public class EncFilter implements Filter { //初始化方法 --执行一次 String abc; @Override public void init(FilterConfig filterConfig) throws ServletException { //UTF-8 abc = filterConfig.getServletContext().getInitParameter("abc"); } //服务请求方法---执行多次 @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { //到达目标资源之前的处理操作 req.setCharacterEncoding(abc); //执行下一个过滤器或者目标资源 chain.doFilter(req,resp); //离开服务器之前的处理操作 } //销毁--执行一次 @Override public void destroy() { } <!--全局参数--> <context-param> <param-name>abc</param-name> <param-value>utf-8</param-value> </context-param> <filter> <filter-name>EncFilter</filter-name> <filter-class>com.bjsxt.filter.EncFilter</filter-class> </filter>
使用过滤器进行登陆的控制
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest) req; HttpServletResponse response=(HttpServletResponse)resp; Object emp = request.getSession().getAttribute("emp"); String uri = request.getRequestURI(); String queryString = request.getQueryString(); System.out.println(uri+"--"+queryString); if("/sxtoa/login.jsp".equals(uri)||"/sxtoa/servlet/EmployeeServlet?method=empLogin".equals(uri+"?"+queryString)){ filterChain.doFilter(request,response); }else { if(emp==null){ //用户没有登陆 response.sendRedirect(request.getContextPath()+"/login.jsp"); }else { //直接放行 --执行目标的资源 filterChain.doFilter(request,response); } } }
过滤器更多内容
问题1:多个过滤器,执行的顺序怎么确定?
<filter-mapping>的顺序确定执行的顺序
问题2:每个请求和响应都要经过过滤器吗?
不是,是否经过过滤器,经过几个过滤器由过滤器的路径来定;
<url-pattern>/servlet/*</url-pattern> <url-pattern>/*</url-pattern>
问题3:请求和响应时是不是分别将过滤器代码从头到尾执行一遍
不是;请求时执行预处理操作,响应时执行后处理操作;
请求时过滤器的执行顺序如果是1,2,4,响应时过滤器的执行顺序4,2,1
问题4:在过滤器中能否跳转到项目的其他任意资源
可以
举例:如果一个过滤器是进行权限验证,没有登录,就不让访问目标资源,直接跳转到login.jsp
问题5:重定向和转发是否经过过滤器
重定向经过
默认转发不经过,因为是服务器端跳转。可以通过配置解决