专业编程基础技术教程

网站首页 > 基础教程 正文

javaweb之Filter(基于javaweb的网上购物系统的设计与实现)

ccvgpt 2024-07-28 12:32:13 基础教程 8 ℃

javaweb的三大组件之一。

Filter过滤器(/拦截器)是在URL对一组资源(servlet,html,jsp,css,js,jpg等)的请求之前,当满足条件后发行。

javaweb之Filter(基于javaweb的网上购物系统的设计与实现)

  • 接口:Filter
    1. default void init(FilterConfig filterConfig)
    2. void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
    3. default void destroy()
  • 抽象类:abstruct GenericFilter implements Filter
    1. public FilterConfig getFilterConfig()
    2. public ServletContext getServletContext()
    3. public void init(FilterConfig filterConfig) throws ServletException {
      this.filterConfig = filterConfig;
      this.init();
      }
    4. public void init() throws ServletException
  • 抽象类:HttpFilter extends GenericFilter
    1. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){ this.doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);}
    2. protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
      chain.doFilter(request, response); //放行
      }

    因此我们可以参照Servlet方法,继承HttpFilter即可,重写其中的doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)方法。

    Filter的执行过程:

    Filter的执行顺序:

  • web.xml中是按照部署顺序执行的;
  • @WebFilter注解方式中是按照filterName的字符比较顺序,AFilterName > BFilterName。
  • 注解方式:

    @WebFilter(filterName = "RequestFilter",urlPatterns = "/*",dispatcherTypes = {DispatcherType.REQUEST})
  • filterName:唯一的命名。
  • urlPatterns:拦截请求路径组 {"/*","/AServlet"}
  • dispatcherTypes :拦截方式,四种:REQUEST,FORWARD,ERROR,INCLUDE
  • 拦截方式

  • REQUEST:默认的方式:对请求进行拦截
  • FORWARD:对转发至urlPatterns的请求进行拦截
  • ERROR:对错误请求进行拦截
  • 在web.xml中设置错误页

    <error-page>    
      <error-code>404</error-code> 
    	<location>/404.html</location>
    </error-page>
  • INCLUDE:对包含进行拦截,很少用
  • 测试代码:

    1.MyServlet AbsServlet见上篇

    @WebServlet(name = "MyServlet",urlPatterns = {"/error","/add","/delete"})
    public class MyServlet extends AbsServlet {  
      public String add(HttpServletRequest req,HttpServletResponse res){    
        System.out.println("this is add");      
        //转发     
        return "forward:/delete";   
      }    
      public String delete(HttpServletRequest req,HttpServletResponse res){      
        System.out.println("this is delete");  
        return "这是this is delete";  
      }   
      public void error (HttpServletRequest req,HttpServletResponse res)throws Exception { 
        //错误重定向到错误页     
        System.out.println("this is error");    
        res.sendRedirect(req.getContextPath()+"/404.html");  
      } 
    }

    2.ForwardFilter

    //转发至/delete的请求进行拦截
    @WebFilter(filterName = "ForwardFilter",urlPatterns = "/delete",    dispatcherTypes = {DispatcherType.FORWARD})
    public class ForwardFilter extends HttpFilter {    
      @Override   
      public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {      
        System.out.println("FORWARD Filter");      
        chain.doFilter(request,response); 
      }
    }

    3.ErrorFilter

    //错误拦截,错误页在web.xml中设置
    @WebFilter(filterName = "ErrorFilter",urlPatterns = "/*",    dispatcherTypes = {DispatcherType.ERROR})
    public class ErrorFilter extends HttpFilter {    
      @Override 
      public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {     
        System.out.println("Error Filter");    
        chain.doFilter(request,response); 
      }
    }

    4.EncodingFilter

    //拦截所有请求进行编码设计,为保证为第一个拦截器,在filterName前加了AAA
    //DispatcherType.REQUEST为默认方式,可以不设置
    @WebFilter(filterName = "AAAEncodingFilter",urlPatterns = "/*",  dispatcherTypes={DispatcherType.REQUEST})
    public class EncodingFilter extends HttpFilter {   
      @Override    public void doFilter(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException {        
        System.out.println("EncodingFilter");    
        req.setCharacterEncoding("utf-8");    
        resp.setContentType("text/html;charset=utf-8");  
        chain.doFilter(req, resp); 
      }
    }

    5.web.xml

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"   
    version="4.0">
      <error-page>    
      <!--错误编码404,错误页404.html--> 
      <error-code>404</error-code> 
    	<location>/404.html</location>
      </error-page>
    </web-app>

    当浏览器进行:http: //localhost:8088/javaweb/add 时,会转发请求/delete,同时执行拦截器ForwardFilter

    http: //localhost:8088/javaweb/add1 /add1不存在,执行错误拦截器ErrorFilter,转向错误页面404.html

    关于编码的设置

    //自定义类将HttpRequest进行包装,更新方法getParameter
    //方法getParameter重写req.getMethod为get方式时的转换
    public class EncodingRequest extends HttpServletRequestWrapper{   
      private HttpServletRequest req = null;  
      public EncodingRequest(HttpServletRequest req) {      
        super(req);     
        this.req = req; 
      }   
      @Override   
      public String getParameter(String s)  {       
        String result = req.getParameter(s);   
        try {     
          result = new String(result.getBytes("ISO-8859-1"),"utf-8");    
        } catch (UnsupportedEncodingException e) {      
          e.printStackTrace();     
        }      
        return result;  
      }
    }
    @WebFilter(filterName = "AAAEncodingFilter",urlPatterns = "/*", dispatcherTypes={DispatcherType.REQUEST})
    public class EncodingFilter extends HttpFilter {  
      @Override    
      public void doFilter(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException {        
        //请求为post和请求为get时的编码设置        
        if(req.getMethod().equals("post")){         
          req.setCharacterEncoding("utf-8");    
        } else if (req.getMethod().equals("get")) {     
          //req转为EncodingRequest类型,执行的是自定义类中的方法   
          req = (EncodingRequest)req;    
        }        
        System.out.println("EncodingFilter");     
        //响应编码      
        resp.setContentType("text/html;charset=utf-8");      
        chain.doFilter(req, resp);  
      }
    }

    Tags:

    最近发表
    标签列表