zoukankan      html  css  js  c++  java
  • JSP之过滤器Filter

    摘要:

          Filter可认为是Servlet的“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。

    Filter也可以对用户请求响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。

    使用Filter完整流程:

    Filter对用户请求进行预处理,接着请求给Servlet进行处理并生成响应,最后Filter再对服务器进行后处理

    Filter有如下几个用处:

    • HttpServletRequest到达Servlet之前,拦截用户的HttpServletRequest
    • 根据需要要检查HttpServletRequest也可以修改HttpServletRequest头和数据
    • HttpServletResponse到达客户端之前,拦截HttpServletResponse
    • 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据

    Filter有如下几个种类:

    • 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户的非法请求
    • 日志Filter:详细记录某些特殊的用户请求
    • 负责解码的Filter:包裹对非标准码的请求解码
    • 能改变xml内容的XSLT Filter
    • Filter可负责拦截多个请求或相应:一个请求或响应也可以被多个Filter拦截

    创建一个Filter只需要两个步骤

    1:创建Filter处理类

    2web.xml文件中配置Filter

    程序演示:

     1 package com.huayu.filter;
     2 import java.io.IOException;
     3 
     4 import javax.servlet.Filter;
     5 import javax.servlet.FilterChain;
     6 import javax.servlet.FilterConfig;
     7 import javax.servlet.ServletContext;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.http.HttpServletRequest;
    12 
    13 
    14 public class Filter001 implements Filter{
    15     private FilterConfig config;
    16     @Override
    17     public void init(FilterConfig arg0) throws ServletException {
    18         arg0=config;
    19     }
    20 
    21 
    22     
    23 
    24     @Override
    25     public void doFilter(ServletRequest req, ServletResponse res,
    26             FilterChain filterchain) throws IOException, ServletException {
    27         //预处理
    28         ServletContext context=this.config.getServletContext();
    29         long before=System.currentTimeMillis();
    30         System.out.println("开始过滤");
    31         //将请求转换成httpServletRequest请求
    32         HttpServletRequest htsre=(HttpServletRequest) req;
    33         System.out.println("Filter已经截获到的请求地址:"+htsre.getServletPath());
    34         //过滤器只是链式处理,请求依旧放到目标地址
    35         filterchain.doFilter(req, res);
    36         
    37         //---------对服务器响应后处理----------
    38         long after=System.currentTimeMillis();
    39         System.out.println("过滤结束");
    40         
    41         System.out.println("请求被定为到"+htsre.getRequestURI()+"所花时间"+(after-before));
    42         
    43     }
    44 
    45     @Override
    46     public void destroy() {
    47         
    48         
    49     }
    50     
    51 }
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
     3   <display-name>FilterAndEl</display-name>
     4   <welcome-file-list>
     5     <welcome-file>index.html</welcome-file>
     6     <welcome-file>index.htm</welcome-file>
     7     <welcome-file>index.jsp</welcome-file>
     8     <welcome-file>default.html</welcome-file>
     9     <welcome-file>default.htm</welcome-file>
    10     <welcome-file>default.jsp</welcome-file>
    11   </welcome-file-list>
    12   <filter>
    13           <filter-name>log</filter-name>
    14           <filter-class>com.huayu.filter.Filter001</filter-class>
    15   </filter>
    16   <filter-mapping>
    17           <filter-name>log</filter-name>
    18           <url-pattern>/*</url-pattern>
    19   </filter-mapping>
    20 </web-app>

    总结:

    创建Filter必须实现javax.servlet.Filter接口,重写三个方法

    void init(FilterConfig config):用于完成Filter的初始化

    void destroy():用于Filter销毁前,完成某些操作

    public void doFilter(ServletRequest request, ServletResponse response,

    FilterChain filterchain) throws IOException, ServletException 

     该方法就是对没个请求及响应增加额外的处理

    过滤器对用户的请求进行预处理和服务器的响应进行后处理的分解线

    FilterChain.doFilter()

    配置过滤器:

    两种方式

    1:在web.xml里面配置

    2:用注解的方式(web3.0之后才可以使用)

    下面通过注解的方式来配置过滤器并且通过使用过滤器来解决中文乱码问题

    程序如下:

     1 package com.huayu.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.annotation.WebFilter;
    12 import javax.servlet.annotation.WebInitParam;
    13 import javax.servlet.http.HttpServletRequest;
    14 import javax.servlet.http.HttpSession;
    15 @WebFilter(urlPatterns={"/*"},
    16             initParams={
    17                 @WebInitParam(name="encoding",value="GBK"),
    18                 @WebInitParam(name="loginpage",value="login.jsp"),
    19                 @WebInitParam(name="proLogin",value="loginSuccessful.jsp")
    20 }
    21         
    22         )
    23 public class Filter002 implements Filter{
    24     private FilterConfig config;
    25     @Override
    26     public void init(FilterConfig config) throws ServletException {
    27         this.config=config;
    28     }
    29 
    30 
    31 
    32     @Override
    33     public void doFilter(ServletRequest req, ServletResponse res,
    34             FilterChain fc) throws IOException, ServletException {
    35             
    36         String encoding=config.getInitParameter("encoding");
    37         String loginpage=config.getInitParameter("loginpage");
    38         String proLogin=config.getInitParameter("proLogin");
    39         //处理乱码
    40         req.setCharacterEncoding("GBK");
    41         HttpServletRequest requ=(HttpServletRequest) req;
    42         HttpSession session=requ.getSession();
    43         String name=(String) session.getAttribute("name");
    44         
    45         if(name!=null&&!("".equals(name))){
    46             session.setAttribute("name", req.getParameter("username"));
    47             fc.doFilter(req, res);
    48             
    49         }else{
    50             req.getRequestDispatcher(loginpage).forward(req, res);
    51             
    52         }
    53     }
    54     @Override
    55     public void destroy() {
    56         // TODO Auto-generated method stub
    57         
    58     }
    59 }
  • 相关阅读:
    ubuntu 上安装ssh
    应用架构设计原则、模式摘录
    经典算法摘录
    CSS3选择器笔记
    微信支付 统一下单 字段 body 为中文时 报【签名错误】解决方案(C# SDK)
    C#获取gif帧数
    C#根据byte前两位获取图片扩展名
    使用Amazon AWS SNS 发送 SMS 消息 .net
    MyCAT全局序列号-数据库方式
    MyCAT入门实践
  • 原文地址:https://www.cnblogs.com/ztyy04126/p/5010946.html
Copyright © 2011-2022 走看看