• JavaWeb之过滤器


    过滤器

    什么是过滤器

              1示意图:

      

      过滤器的作用:

             1.过滤器的作用好比一个保安。是servlet规范中的技术

             2.用户在访问应用的资源之前或者之后,可以对请求做出一定的处理

      编写过滤器步骤:

             1.编写一个类,实现javax.servlet.Filter接口

          

             2.配置过滤哪些资源 :修改web.xml配置要过滤的映射地址

          

            3.让目标资源执行,放行:

           

    1     <filter>
    2         <filter-name/>
    3         <filter-class/>
    4     </filter>
    5     <filter-mapping>
    6         <filter-name/>
    7         <url-pattern/>   /servlet/*     *.jsp
    8         <dispatcher/>              REQUEST(默认的) FROWARD INCLUDE ERROR
    9     </filter-mapping>
    配置web.xml,指定哪些资源需要过滤

      过滤器的生命周期

               1.过滤器实例由服务器创建的,其中的方法也是由服务器调用的

               2.过滤器在应用被加载时实例化并初始化(调用init方法),只有一次;用户每次访问过滤范围之内的资源,过滤器的DoFilter方法都会执行一次:应用被卸载或者服务器停止时会调用销毁方法(destroy方法)

               3.特点:过滤器中的实例变量,注意线程安全问题;

      过滤器的过滤顺序

             1.责任设计模式:

                    

                二:多个过滤器代码执行顺序:

                            

                             

                              总结:多个过滤器过滤相同的资源,过滤顺序按照web中的filter的出现顺序依次进行过滤。类似于

    Servlet VS Filter:

        1.servlet能做的过滤器都可以做,过滤器比servlet多了一个放行的功能。

        2.servlet在开发中是作为控制器来用的;Filter也可以作为控制器来用

        3.Struct1框架:servlet作为控制器

           Struct2框架:Filter作为控制器

        

      过滤器的简单案例:

                1.过滤器设置提交数据编码:

                

                 

              1、解决POST请求参数和响应输出的编码过滤器:

                  

                  web.xml配置文件:

                   

                  二:动态资源不要缓存过滤器:

                                

                    

                                

                    三:控制静态资源的缓存时间:

                                  

                                    

    自动登入过滤器案例

    实体类:

     1 import java.io.Serializable;
     2 
     3 public class User implements Serializable {
     4     private String username;
     5     private String password;
     6     
     7     public User(){}
     8     
     9     public User(String username, String password) {
    10         super();
    11         this.username = username;
    12         this.password = password;
    13     }
    14     public String getUsername() {
    15         return username;
    16     }
    17     public void setUsername(String username) {
    18         this.username = username;
    19     }
    20     public String getPassword() {
    21         return password;
    22     }
    23     public void setPassword(String password) {
    24         this.password = password;
    25     }
    26     
    27 }
    User
     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 public class UserDB {
     5     private static List<User> users = new ArrayList<User>();
     6     static{
     7         users.add(new User("王斐", "123"));
     8         users.add(new User("王昭珽", "123"));
     9     }
    10     public static User findUser(String username,String password){
    11         for(User u:users){
    12             if(username.equals(u.getUsername())&&password.equals(u.getPassword())){
    13                 return u;
    14             }
    15         }
    16         return null;
    17     }
    18     public static User findUser(String username){
    19         for(User u:users){
    20             if(username.equals(u.getUsername())){
    21                 return u;
    22             }
    23         }
    24         return null;
    25     }
    26 }
    UserDB

    过滤器类:

     1 import java.io.IOException;
     2 
     3 import javax.servlet.Filter;
     4 import javax.servlet.FilterChain;
     5 import javax.servlet.FilterConfig;
     6 import javax.servlet.ServletException;
     7 import javax.servlet.ServletRequest;
     8 import javax.servlet.ServletResponse;
     9 import javax.servlet.http.Cookie;
    10 import javax.servlet.http.HttpServletRequest;
    11 import javax.servlet.http.HttpServletResponse;
    12 import javax.servlet.http.HttpSession;
    13 
    14 import com.itheima.domain.User;
    15 import com.itheima.domain.UserDB;
    16 import com.itheima.util.Base64Util;
    17 import com.itheima.util.MD5Util;
    18 //实现自动登录的过滤器
    19 public class AutoLoginFilter implements Filter {
    20     public void doFilter(ServletRequest req, ServletResponse resp,
    21             FilterChain chain) throws IOException, ServletException {
    22         
    23         HttpServletRequest request;
    24         HttpServletResponse response;
    25         try{
    26             request = (HttpServletRequest)req;
    27             response = (HttpServletResponse)resp;
    28         }catch(Exception e){
    29             throw new RuntimeException("non-http request");
    30         }
    31         //判断用户是否登录
    32         HttpSession session = request.getSession();
    33         User user = (User)session.getAttribute("user");
    34         //没有登录:自动登录
    35         if(user==null){
    36             //从cookie中取数据:用户名和密码
    37             Cookie cs[] = request.getCookies();
    38             for(int i=0;cs!=null&&i<cs.length;i++){
    39                 Cookie c = cs[i];
    40                 if("loginInfo".equals(c.getName())){
    41                     //再次验证用户名和密码的正确性
    42                     String usernameBase64 = c.getValue().split("_")[0];
    43                     String passwordMD5 = c.getValue().split("_")[1];
    44                     
    45                     String username = Base64Util.base64decode(usernameBase64);
    46                     User dbUser = UserDB.findUser(username);
    47                     if(passwordMD5.equals(MD5Util.md5(dbUser.getPassword()))){
    48                         //用户名和密码都正确
    49                         session.setAttribute("user", dbUser);
    50                     }
    51                     
    52                 }
    53             }
    54         }
    55         //放行
    56         chain.doFilter(request, response);
    57     }
    58     public void init(FilterConfig filterConfig) throws ServletException {
    59 
    60     }
    61 
    62     public void destroy() {
    63 
    64     }
    65 
    66 }
    AutoLoginFilter
     1 import java.io.IOException;
     2 
     3 import javax.servlet.Filter;
     4 import javax.servlet.FilterChain;
     5 import javax.servlet.FilterConfig;
     6 import javax.servlet.ServletException;
     7 import javax.servlet.ServletRequest;
     8 import javax.servlet.ServletResponse;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletResponse;
    11 //动态资源不要缓存
    12 public class DynamicResourceNoCacheFilter implements Filter {
    13 
    14     public void init(FilterConfig filterConfig) throws ServletException {
    15 
    16     }
    17 
    18     public void doFilter(ServletRequest req, ServletResponse resp,
    19             FilterChain chain) throws IOException, ServletException {
    20         
    21         HttpServletRequest request;
    22         HttpServletResponse response;
    23         try{
    24             request = (HttpServletRequest)req;
    25             response = (HttpServletResponse)resp;
    26         }catch(Exception e){
    27             throw new RuntimeException("non-http request");
    28         }
    29         
    30         response.setHeader("Expires", "-1");
    31         response.setHeader("Cache-Control", "no-cache");
    32         response.setHeader("Pragma", "no-cache");
    33         chain.doFilter(request, response);
    34     }
    35 
    36     public void destroy() {
    37 
    38     }
    39 
    40 }
    DynamicResourceNoCacheFilter
     1 import java.io.IOException;
     2 
     3 import javax.servlet.Filter;
     4 import javax.servlet.FilterChain;
     5 import javax.servlet.FilterConfig;
     6 import javax.servlet.ServletException;
     7 import javax.servlet.ServletRequest;
     8 import javax.servlet.ServletResponse;
     9 //解决POST请求参数和响应输出的编码过滤器
    10 public class SetCharacterEncodingFilter implements Filter {
    11     private FilterConfig filterConfig;
    12     public void init(FilterConfig filterConfig) throws ServletException {
    13         this.filterConfig = filterConfig;
    14     }
    15 
    16     public void doFilter(ServletRequest request, ServletResponse response,
    17             FilterChain chain) throws IOException, ServletException {
    18         String encoding = "UTF-8";//默认参数
    19         String value = filterConfig.getInitParameter("encoding");
    20         if(value!=null){
    21             encoding = value;
    22         }
    23         
    24         request.setCharacterEncoding(encoding);//POST请求方式
    25         response.setContentType("text/html;charset="+encoding);
    26         chain.doFilter(request, response);
    27     }
    28 
    29     public void destroy() {
    30 
    31     }
    32 
    33 }
    SetCharacterEncodingFilter

    控制器类

     1 import java.io.IOException;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.http.Cookie;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 import com.itheima.domain.User;
    10 import com.itheima.domain.UserDB;
    11 import com.itheima.util.Base64Util;
    12 import com.itheima.util.MD5Util;
    13 
    14 public class LoginServlet extends HttpServlet {
    15 
    16     public void doGet(HttpServletRequest request, HttpServletResponse response)
    17             throws ServletException, IOException {
    18         String username = request.getParameter("username");
    19         String password = request.getParameter("password");
    20         String remember = request.getParameter("remember");
    21         User user = UserDB.findUser(username, password);
    22         if(user!=null){
    23             request.getSession().setAttribute("user", user);
    24             username = Base64Util.base64encode(username);
    25             password = MD5Util.md5(password);
    26             //保存cookie
    27             Cookie cookie = new Cookie("loginInfo", username+"_"+password);//用户名_密码
    28             cookie.setPath(request.getContextPath());//当前应用都能获取该Cookie
    29             if(remember!=null){
    30                 cookie.setMaxAge(Integer.MAX_VALUE);
    31             }else{
    32                 cookie.setMaxAge(0);
    33             }
    34             response.addCookie(cookie);
    35             
    36             response.getWriter().write("登录成功!2秒后转向主页");
    37             response.setHeader("Refresh", "2;URL="+request.getContextPath());
    38         }else{
    39             response.getWriter().write("错误的用户名或密码");
    40         }
    41     }
    42 
    43     public void doPost(HttpServletRequest request, HttpServletResponse response)
    44             throws ServletException, IOException {
    45         doGet(request, response);
    46     }
    47 
    48 }
    LoginServlet
     1 import java.io.IOException;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.http.HttpServlet;
     5 import javax.servlet.http.HttpServletRequest;
     6 import javax.servlet.http.HttpServletResponse;
     7 
     8 public class LogoutServlet extends HttpServlet {
     9 
    10     public void doGet(HttpServletRequest request, HttpServletResponse response)
    11             throws ServletException, IOException {
    12         request.getSession().removeAttribute("user");
    13         response.getWriter().write("注销成功!2秒后转向主页");
    14         response.setHeader("Refresh", "2;URL="+request.getContextPath());
    15     }
    16 
    17     public void doPost(HttpServletRequest request, HttpServletResponse response)
    18             throws ServletException, IOException {
    19         doGet(request, response);
    20     }
    21 
    22 }
    LogoutServlet

    油条类:

     1 import java.security.MessageDigest;
     2 import java.security.NoSuchAlgorithmException;
     3 
     4 import sun.misc.BASE64Encoder;
     5 
     6 public class MD5Util {
     7     public static String md5(String str){
     8         try {
     9             MessageDigest md = MessageDigest.getInstance("MD5");
    10             byte b[] = md.digest("123".getBytes());//返回值是二进制,不一定对应着可见字符
    11             //数据指纹
    12             
    13             String s = new BASE64Encoder().encode(b);
    14             return s;
    15         } catch (NoSuchAlgorithmException e) {
    16             throw new RuntimeException(e);
    17         }
    18     }
    19 }
    MD5Util
     1 import java.io.IOException;
     2 import java.io.UnsupportedEncodingException;
     3 
     4 import sun.misc.BASE64Decoder;
     5 import sun.misc.BASE64Encoder;
     6 
     7 public class Base64Util {
     8     public static String base64encode(String str){
     9         BASE64Encoder base64 = new BASE64Encoder();
    10         String s1 = base64.encode(str.getBytes());//GBK
    11         return s1;
    12     }
    13     public static String base64encode(String str,String charaset) throws UnsupportedEncodingException{
    14         BASE64Encoder base64 = new BASE64Encoder();
    15         String s1 = base64.encode(str.getBytes(charaset));
    16         return s1;
    17     }
    18     public static String base64decode(String str) throws IOException{
    19         BASE64Decoder base64 = new BASE64Decoder();
    20         byte b[] = base64.decodeBuffer(str);
    21         return new String(b);//GBK
    22     }
    23     public static String base64decode(String str,String charaset) throws IOException{
    24         BASE64Decoder base64 = new BASE64Decoder();
    25         byte b[] = base64.decodeBuffer(str);
    26         return new String(b,charaset);//GBK
    27     }
    28 }
    Base64Util

    BASE64编码(很重要)

                            1.原理:3个字节变成4个字节(计算机中存储的都是字节)

                            2.编码原理:

                              1010 0101      1110 0100     1001 1111                 三个字节

                               0010 1001     0001 1110      0001 0010      0001 1111               四个字节(不够就前面补0,补两个)

                            每个字节表示的范围:00000000~0011111, 

                              表示的整数范围:0~63;每一个整数都对应着键盘上的一个可见字符;

                            3.Base64是一个码表;可以把任何的二进制转变为可见字符串(A~Z,a~z,0~9,+/)

                            4.解决汉字存入cookie及MD5加密密码的问题:

     1 import java.io.IOException;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.http.Cookie;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 import com.itheima.domain.User;
    10 import com.itheima.domain.UserDB;
    11 import com.itheima.util.Base64Util;
    12 import com.itheima.util.MD5Util;
    13 
    14 public class LoginServlet extends HttpServlet {
    15 
    16     public void doGet(HttpServletRequest request, HttpServletResponse response)
    17             throws ServletException, IOException {
    18         String username = request.getParameter("username");
    19         String password = request.getParameter("password");
    20         String remember = request.getParameter("remember");
    21         User user = UserDB.findUser(username, password);
    22         if(user!=null){
    23             request.getSession().setAttribute("user", user);
    24             username = Base64Util.base64encode(username);
    25             password = MD5Util.md5(password);
    26             //保存cookie
    27             Cookie cookie = new Cookie("loginInfo", username+"_"+password);//用户名_密码
    28             cookie.setPath(request.getContextPath());//当前应用都能获取该Cookie
    29             if(remember!=null){
    30                 cookie.setMaxAge(Integer.MAX_VALUE);
    31             }else{
    32                 cookie.setMaxAge(0);
    33             }
    34             response.addCookie(cookie);
    35             
    36             response.getWriter().write("登录成功!2秒后转向主页");
    37             response.setHeader("Refresh", "2;URL="+request.getContextPath());
    38         }else{
    39             response.getWriter().write("错误的用户名或密码");
    40         }
    41     }
    42 
    43     public void doPost(HttpServletRequest request, HttpServletResponse response)
    44             throws ServletException, IOException {
    45         doGet(request, response);
    46     }
    47 
    48 }
    LoginServlet
     1 import java.security.MessageDigest;
     2 import java.security.NoSuchAlgorithmException;
     3 
     4 import sun.misc.BASE64Encoder;
     5 
     6 public class MD5Util {
     7     public static String md5(String str){
     8         try {
     9             MessageDigest md = MessageDigest.getInstance("MD5");
    10             byte b[] = md.digest("123".getBytes());//返回值是二进制,不一定对应着可见字符
    11             //数据指纹
    12             
    13             String s = new BASE64Encoder().encode(b);
    14             return s;
    15         } catch (NoSuchAlgorithmException e) {
    16             throw new RuntimeException(e);
    17         }
    18     }
    19 }
    MD5Util
     1 import java.io.IOException;
     2 import java.io.UnsupportedEncodingException;
     3 
     4 import sun.misc.BASE64Decoder;
     5 import sun.misc.BASE64Encoder;
     6 
     7 public class Base64Util {
     8     public static String base64encode(String str){
     9         BASE64Encoder base64 = new BASE64Encoder();
    10         String s1 = base64.encode(str.getBytes());//GBK
    11         return s1;
    12     }
    13     public static String base64encode(String str,String charaset) throws UnsupportedEncodingException{
    14         BASE64Encoder base64 = new BASE64Encoder();
    15         String s1 = base64.encode(str.getBytes(charaset));
    16         return s1;
    17     }
    18     public static String base64decode(String str) throws IOException{
    19         BASE64Decoder base64 = new BASE64Decoder();
    20         byte b[] = base64.decodeBuffer(str);
    21         return new String(b);//GBK
    22     }
    23     public static String base64decode(String str,String charaset) throws IOException{
    24         BASE64Decoder base64 = new BASE64Decoder();
    25         byte b[] = base64.decodeBuffer(str);
    26         return new String(b,charaset);//GBK
    27     }
    28 }
    Base64Util

    过滤器的高级配置

                   

    1.静态包含:将多个界面作为一个资源,所以过滤器只过滤一次

    2.服务器内部转发如果不进行配置xml文件,那就只过滤一次:

    巩固装饰设计模式

                   

                  1、定义一个类实现与被包装类相同的接口

                  2、定义一个变量,引用被包装类的实例

                  3、定义构造方法,传入被包装类实例

                  4、对于要改变的方法,改写即可

                  5、对于不需要改变的方法,调用被包装类原有的方法

     1 package com.base;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.FileReader;
     5 import java.io.IOException;
     6 import java.io.Reader;
     7 
     8 public class BufferedReaderDemo {
     9 
    10     public BufferedReaderDemo() {
    11         // TODO Auto-generated constructor stub
    12     }
    13 
    14     public static void main(String[] args) throws IOException {
    15         // TODO Auto-generated method stub
    16             Reader r=new FileReader("src/com/base/BufferedReaderDemo.java");
    17             BufferedReader br=new BufferedReader(r);//本身就是一个包装类
    18             MyBufferedReader mbr=new MyBufferedReader(br);
    19             
    20             String data=null;
    21             while((data=mbr.readLine())!=null){
    22                 System.out.println(data);
    23             }
    24             mbr.close();
    25     }
    26 
    27 }
    BufferedReaderDemo
     1 package com.base;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 
     6 public class MyBufferedReader extends BufferedReader {
     7 private BufferedReader br;
     8 private int num=1;
     9 
    10 public MyBufferedReader(BufferedReader br) {
    11     // TODO Auto-generated constructor stub
    12     super(br);
    13     this.br=br;
    14 }
    15 //public String readLine() throws IOException{
    16 //    return num+++br.readLine();
    17 //}
    18 public String readLine() throws IOException{
    19     String data=br.readLine();
    20     if(data!=null){
    21         data=num+++data;
    22     }
    23     return data;
    24 }
    25 
    26 //private int num=1;
    27 //public MyBufferedReader(BufferedReader br) {
    28 //    super(br);
    29 //}
    30 //public String readLine() throws IOException{
    31 //    String data=super.readLine();
    32 //    if(data!=null){
    33 //        data=num+++data;
    34 //    }
    35 //    return data;
    36 //}
    37 }
    MyBufferedReader

    过滤器的高级案例

    解决全站中文乱码过滤器(get,post):

     

    案例撸上:

     1 package com.itheima.filter;
     2 
     3 import java.io.IOException;
     4 import java.io.UnsupportedEncodingException;
     5 
     6 import javax.servlet.Filter;
     7 import javax.servlet.FilterChain;
     8 import javax.servlet.FilterConfig;
     9 import javax.servlet.ServletException;
    10 import javax.servlet.ServletRequest;
    11 import javax.servlet.ServletResponse;
    12 import javax.servlet.http.HttpServletRequest;
    13 import javax.servlet.http.HttpServletRequestWrapper;
    14 import javax.servlet.http.HttpServletResponse;
    15 //解决GET和POST请求参数和响应输出的编码过滤器
    16 public class SetAllCharacterEncodingFilter implements Filter {
    17     private FilterConfig filterConfig;
    18     public void init(FilterConfig filterConfig) throws ServletException {
    19         this.filterConfig = filterConfig;
    20     }
    21 
    22     public void doFilter(ServletRequest req, ServletResponse resp,
    23             FilterChain chain) throws IOException, ServletException {
    24         HttpServletRequest request;
    25         HttpServletResponse response;
    26         try{
    27             request = (HttpServletRequest)req;
    28             response = (HttpServletResponse)resp;
    29         }catch(Exception e){
    30             throw new RuntimeException("non-http request");
    31         }
    32         String encoding = "UTF-8";//默认参数
    33         String value = filterConfig.getInitParameter("encoding");
    34         if(value!=null){
    35             encoding = value;
    36         }
    37         
    38         request.setCharacterEncoding(encoding);//POST请求方式
    39         response.setContentType("text/html;charset="+encoding);
    40         MyHttpServletRequest mrequest = new MyHttpServletRequest(request);
    41         chain.doFilter(mrequest, response);
    42     }
    43 
    44     public void destroy() {
    45 
    46     }
    47 
    48 }
    49 class MyHttpServletRequest extends HttpServletRequestWrapper{
    50     private HttpServletRequest request;
    51     public MyHttpServletRequest(HttpServletRequest request){
    52         super(request);
    53         this.request = request;
    54     }
    55     public String getParameter(String name) {
    56         String value = request.getParameter(name);
    57         if(value==null)
    58             return value;
    59         try {
    60             if("get".equalsIgnoreCase(request.getMethod()))
    61                 value = new String(value.getBytes("ISO-8859-1"),request.getCharacterEncoding());
    62         } catch (UnsupportedEncodingException e) {
    63             e.printStackTrace();
    64         }
    65         return value;
    66     }
    67     
    68 }
    SetAllCharacterEncodingFilter
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="2.5" 
     3     xmlns="http://java.sun.com/xml/ns/javaee" 
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     7   <display-name></display-name>
     8   <filter>
     9       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    10       <filter-class>com.itheima.filter.SetAllCharacterEncodingFilter</filter-class>
    11   </filter>
    12   <filter-mapping>
    13       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    14       <url-pattern>/*</url-pattern>
    15   </filter-mapping>
    16   <welcome-file-list>
    17     <welcome-file>index.jsp</welcome-file>
    18   </welcome-file-list>
    19 </web-app>
    web.xml

    脏话过滤器

     1 import java.io.IOException;
     2 
     3 import javax.servlet.Filter;
     4 import javax.servlet.FilterChain;
     5 import javax.servlet.FilterConfig;
     6 import javax.servlet.ServletException;
     7 import javax.servlet.ServletRequest;
     8 import javax.servlet.ServletResponse;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletRequestWrapper;
    11 import javax.servlet.http.HttpServletResponse;
    12 
    13 public class DirtyWordsFilter implements Filter {
    14 
    15     public void init(FilterConfig filterConfig) throws ServletException {
    16 
    17     }
    18 
    19     public void doFilter(ServletRequest req, ServletResponse resp,
    20             FilterChain chain) throws IOException, ServletException {
    21         HttpServletRequest request;
    22         HttpServletResponse response;
    23         try{
    24             request = (HttpServletRequest)req;
    25             response = (HttpServletResponse)resp;
    26         }catch(Exception e){
    27             throw new RuntimeException("non-http request");
    28         }
    29         DirtyWordHttpServletRequest dwrequest = new DirtyWordHttpServletRequest(request);
    30         chain.doFilter(dwrequest, response);
    31         
    32 
    33     }
    34 
    35     public void destroy() {
    36 
    37     }
    38 
    39 }
    40 class DirtyWordHttpServletRequest extends HttpServletRequestWrapper{
    41     private String strs[] = {"傻逼","畜生","禽兽"};
    42     private HttpServletRequest request;
    43     public DirtyWordHttpServletRequest(HttpServletRequest request){
    44         super(request);
    45         this.request = request;
    46     }
    47     @Override
    48     public String getParameter(String name) {
    49         String value = request.getParameter(name);
    50         if(value==null)
    51             return null;
    52         for(String s:strs){
    53             if(value.contains(s)){
    54                 value = value.replace(s, "**");
    55             }
    56         }
    57         return value;
    58     }
    59     
    60 }
    DirtyWordsFilter
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="2.5" 
     3     xmlns="http://java.sun.com/xml/ns/javaee" 
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     7   <display-name></display-name>
     8   <filter>
     9       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    10       <filter-class>com.itheima.filter.SetAllCharacterEncodingFilter</filter-class>
    11   </filter>
    12   <filter-mapping>
    13       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    14       <url-pattern>/*</url-pattern>
    15   </filter-mapping>
    16   
    17   <filter>
    18       <filter-name>DirtyWordsFilter</filter-name>
    19       <filter-class>com.itheima.filter.DirtyWordsFilter</filter-class>
    20   </filter>
    21   <filter-mapping>
    22       <filter-name>DirtyWordsFilter</filter-name>
    23       <url-pattern>/*</url-pattern>
    24   </filter-mapping>
    25   </servlet-mapping>    
    26   <welcome-file-list>
    27     <welcome-file>index.jsp</welcome-file>
    28   </welcome-file-list>
    29 </web-app>
    web.xml

    HTML标记过滤器

     1 import java.io.IOException;
     2 
     3 import javax.servlet.Filter;
     4 import javax.servlet.FilterChain;
     5 import javax.servlet.FilterConfig;
     6 import javax.servlet.ServletException;
     7 import javax.servlet.ServletRequest;
     8 import javax.servlet.ServletResponse;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletRequestWrapper;
    11 import javax.servlet.http.HttpServletResponse;
    12 
    13 public class HtmlFilter implements Filter {
    14 
    15     public void init(FilterConfig filterConfig) throws ServletException {
    16 
    17     }
    18 
    19     public void doFilter(ServletRequest req, ServletResponse resp,
    20             FilterChain chain) throws IOException, ServletException {
    21         HttpServletRequest request;
    22         HttpServletResponse response;
    23         try{
    24             request = (HttpServletRequest)req;
    25             response = (HttpServletResponse)resp;
    26         }catch(Exception e){
    27             throw new RuntimeException("non-http request");
    28         }
    29         
    30         HtmlHttpServletRequest hrequest = new HtmlHttpServletRequest(request);
    31         chain.doFilter(hrequest, response);
    32 
    33     }
    34 
    35     public void destroy() {
    36 
    37     }
    38 
    39 }
    40 class HtmlHttpServletRequest extends HttpServletRequestWrapper{
    41     private HttpServletRequest request;
    42     public HtmlHttpServletRequest(HttpServletRequest request){
    43         super(request);
    44         this.request = request;
    45     }
    46     @Override
    47     public String getParameter(String name) {
    48         String value = request.getParameter(name);
    49         if(value==null)
    50             return null;
    51         value = htmlFilter(value);
    52         return value;
    53     }
    54     private String htmlFilter(String message) {
    55         if (message == null)
    56             return (null);
    57 
    58         char content[] = new char[message.length()];
    59         message.getChars(0, message.length(), content, 0);
    60         StringBuffer result = new StringBuffer(content.length + 50);
    61         for (int i = 0; i < content.length; i++) {
    62             switch (content[i]) {
    63             case '<':
    64                 result.append("&lt;");
    65                 break;
    66             case '>':
    67                 result.append("&gt;");
    68                 break;
    69             case '&':
    70                 result.append("&amp;");
    71                 break;
    72             case '"':
    73                 result.append("&quot;");
    74                 break;
    75             default:
    76                 result.append(content[i]);
    77             }
    78         }
    79         return (result.toString());
    80     }
    81     
    82 }
    HtmlFilter
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="2.5" 
     3     xmlns="http://java.sun.com/xml/ns/javaee" 
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     7   <display-name></display-name>
     8   <filter>
     9       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    10       <filter-class>com.itheima.filter.SetAllCharacterEncodingFilter</filter-class>
    11   </filter>
    12   <filter-mapping>
    13       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    14       <url-pattern>/*</url-pattern>
    15   </filter-mapping>
    16   
    17   <filter>
    18       <filter-name>DirtyWordsFilter</filter-name>
    19       <filter-class>com.itheima.filter.DirtyWordsFilter</filter-class>
    20   </filter>
    21   <filter-mapping>
    22       <filter-name>DirtyWordsFilter</filter-name>
    23       <url-pattern>/*</url-pattern>
    24   </filter-mapping>
    25   <filter>
    26       <filter-name>HtmlFilter</filter-name>
    27       <filter-class>com.itheima.filter.HtmlFilter</filter-class>
    28   </filter>
    29   <filter-mapping>
    30       <filter-name>HtmlFilter</filter-name>
    31       <url-pattern>/*</url-pattern>
    32   </filter-mapping>
    33   <servlet>
    34     <servlet-name>ServletDemo1</servlet-name>
    35     <servlet-class>com.itheima.servlet.ServletDemo1</servlet-class>
    36   </servlet>
    37 
    38   <servlet-mapping>
    39     <servlet-name>ServletDemo1</servlet-name>
    40     <url-pattern>/servlet/ServletDemo1</url-pattern>
    41   </servlet-mapping>    
    42   <welcome-file-list>
    43     <welcome-file>index.jsp</welcome-file>
    44   </welcome-file-list>
    45 </web-app>
    web.xml 

    Fzip压缩过滤器

    过滤器:Filter

      1 import java.io.ByteArrayOutputStream;
      2 import java.io.IOException;
      3 import java.io.OutputStreamWriter;
      4 import java.io.PrintWriter;
      5 import java.util.zip.GZIPOutputStream;
      6 
      7 import javax.servlet.Filter;
      8 import javax.servlet.FilterChain;
      9 import javax.servlet.FilterConfig;
     10 import javax.servlet.ServletException;
     11 import javax.servlet.ServletOutputStream;
     12 import javax.servlet.ServletRequest;
     13 import javax.servlet.ServletResponse;
     14 import javax.servlet.http.HttpServletRequest;
     15 import javax.servlet.http.HttpServletResponse;
     16 import javax.servlet.http.HttpServletResponseWrapper;
     17 
     18 public class GzipFilter implements Filter {
     19 
     20     public void init(FilterConfig filterConfig) throws ServletException {
     21 
     22     }
     23 
     24     public void doFilter(ServletRequest req, ServletResponse resp,
     25             FilterChain chain) throws IOException, ServletException {
     26         HttpServletRequest request;
     27         HttpServletResponse response;
     28         try{
     29             request = (HttpServletRequest)req;
     30             response = (HttpServletResponse)resp;
     31         }catch(Exception e){
     32             throw new RuntimeException("non-http request");
     33         }
     34         MyHttpServletResponse myresponse = new MyHttpServletResponse(response);
     35 
     36         chain.doFilter(request, myresponse);
     37         //压缩代码应放到放行后
     38         byte b[] = myresponse.getBytes();//如何拿到原始的数据字节序列
     39         System.out.println("压缩前大小:"+b.length);
     40         ByteArrayOutputStream out = new ByteArrayOutputStream();//内存数组流:缓存输出流
     41         GZIPOutputStream gout = new GZIPOutputStream(out);
     42         gout.write(b);
     43         gout.close();//   压缩后的数据到ByteArrayOutputStream中了
     44         
     45         
     46         b = out.toByteArray();//取出压缩后的数据
     47         System.out.println("压缩后大小:"+b.length);
     48         
     49         //通知浏览器正文的压缩格式
     50         response.setHeader("Content-Encoding", "gzip");
     51         
     52         
     53         response.getOutputStream().write(b);
     54     }
     55 
     56     public void destroy() {
     57 
     58     }
     59 
     60 }
     61 
     62 
     63 
     64 class MyHttpServletResponse extends HttpServletResponseWrapper{
     65     private HttpServletResponse response;
     66     private ByteArrayOutputStream baos = new ByteArrayOutputStream();//存放缓存的字节流输出的数据
     67     private PrintWriter pw;
     68     public MyHttpServletResponse(HttpServletResponse response){
     69         super(response);
     70         this.response = response;
     71     }
     72     //字节流.覆盖该方法的目的,截获原始的数据
     73     public ServletOutputStream getOutputStream() throws IOException {
     74         return new MyServletOutputStream(baos);
     75     }
     76     //字符流输出
     77     public PrintWriter getWriter() throws IOException {
     78         pw = new PrintWriter(new OutputStreamWriter(baos, response.getCharacterEncoding()));
     79         return pw;
     80     }
     81     public byte[] getBytes(){
     82         try {
     83             if(pw!=null)
     84                 pw.close();
     85             baos.flush();
     86         } catch (IOException e) {
     87             e.printStackTrace();
     88         }
     89         return baos.toByteArray();
     90     }
     91 }
     92 
     93 
     94 
     95 class MyServletOutputStream extends ServletOutputStream{
     96     private ByteArrayOutputStream baos;
     97     public MyServletOutputStream(ByteArrayOutputStream baos){
     98         this.baos = baos;
     99     }
    100     public void write(int b) throws IOException {
    101         baos.write(b);
    102     }
    103     
    104 }
    GzipFilter
     1 import java.io.IOException;
     2 import java.io.UnsupportedEncodingException;
     3 
     4 import javax.servlet.Filter;
     5 import javax.servlet.FilterChain;
     6 import javax.servlet.FilterConfig;
     7 import javax.servlet.ServletException;
     8 import javax.servlet.ServletRequest;
     9 import javax.servlet.ServletResponse;
    10 import javax.servlet.http.HttpServletRequest;
    11 import javax.servlet.http.HttpServletRequestWrapper;
    12 import javax.servlet.http.HttpServletResponse;
    13 //解决GET和POST请求参数和响应输出的编码过滤器
    14 public class SetAllCharacterEncodingFilter implements Filter {
    15     private FilterConfig filterConfig;
    16     public void init(FilterConfig filterConfig) throws ServletException {
    17         this.filterConfig = filterConfig;
    18     }
    19 
    20     public void doFilter(ServletRequest req, ServletResponse resp,
    21             FilterChain chain) throws IOException, ServletException {
    22         HttpServletRequest request;
    23         HttpServletResponse response;
    24         try{
    25             request = (HttpServletRequest)req;
    26             response = (HttpServletResponse)resp;
    27         }catch(Exception e){
    28             throw new RuntimeException("non-http request");
    29         }
    30         String encoding = "UTF-8";//默认参数
    31         String value = filterConfig.getInitParameter("encoding");
    32         if(value!=null){
    33             encoding = value;
    34         }
    35         
    36         request.setCharacterEncoding(encoding);//POST请求方式
    37         response.setCharacterEncoding(encoding);
    38         response.setContentType("text/html;charset="+encoding);
    39         MyHttpServletRequest mrequest = new MyHttpServletRequest(request);
    40         chain.doFilter(mrequest, response);
    41     }
    42 
    43     public void destroy() {
    44 
    45     }
    46 
    47 }
    48 class MyHttpServletRequest extends HttpServletRequestWrapper{
    49     private HttpServletRequest request;
    50     public MyHttpServletRequest(HttpServletRequest request){
    51         super(request);
    52         this.request = request;
    53     }
    54     public String getParameter(String name) {
    55         String value = request.getParameter(name);
    56         if(value==null)
    57             return value;
    58         try {
    59             if("get".equalsIgnoreCase(request.getMethod()))
    60                 value = new String(value.getBytes("ISO-8859-1"),request.getCharacterEncoding());
    61         } catch (UnsupportedEncodingException e) {
    62             e.printStackTrace();
    63         }
    64         return value;
    65     }
    66     
    67 }
    SetAllCharacterEncodingFilter

    控制器:Servlet

     1 import java.io.ByteArrayOutputStream;
     2 import java.io.IOException;
     3 import java.util.zip.GZIPOutputStream;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.ServletOutputStream;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 //gzip压缩输出
    11 public class ServletDemo1 extends HttpServlet {
    12 
    13     public void doGet(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15         String data = "<h1>中中</h1>";
    16         ServletOutputStream sos = response.getOutputStream();
    17         sos.write(data.getBytes("UTF-8"));
    18         
    19         
    20 //        byte b[] = data.getBytes();
    21 //        System.out.println("压缩前大小:"+b.length);
    22 //        ByteArrayOutputStream out = new ByteArrayOutputStream();//内存数组流:缓存输出流
    23 //        GZIPOutputStream gout = new GZIPOutputStream(out);
    24 //        gout.write(b);
    25 //        gout.close();//   压缩后的数据到ByteArrayOutputStream中了
    26 //        
    27 //        
    28 //        b = out.toByteArray();//取出压缩后的数据
    29 //        System.out.println("压缩后大小:"+b.length);
    30 //        
    31 //        //通知浏览器正文的压缩格式
    32 //        response.setHeader("Content-Encoding", "gzip");
    33         
    34         
    35 //        response.getOutputStream().write(b);
    36     }
    37 
    38     public void doPost(HttpServletRequest request, HttpServletResponse response)
    39             throws ServletException, IOException {
    40         doGet(request, response);
    41     }
    42 
    43 }
    ServletDemo1
     1 import java.io.IOException;
     2 import java.io.PrintWriter;
     3 
     4 import javax.servlet.ServletException;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 public class ServletDemo2 extends HttpServlet {
    10 
    11     public void doGet(HttpServletRequest request, HttpServletResponse response)
    12             throws ServletException, IOException {
    13         String data = "你dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd";
    14         PrintWriter out = response.getWriter();
    15         out.write(data);
    16     }
    17 
    18     public void doPost(HttpServletRequest request, HttpServletResponse response)
    19             throws ServletException, IOException {
    20         doGet(request, response);
    21     }
    22 
    23 }
    ServletDemo2

    配置文件:web.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="2.5" 
     3     xmlns="http://java.sun.com/xml/ns/javaee" 
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     7   <display-name></display-name>
     8    <filter>
     9       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    10       <filter-class>com.itheima.filter.SetAllCharacterEncodingFilter</filter-class>
    11   </filter>
    12   <filter-mapping>
    13       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    14       <url-pattern>*.html</url-pattern>
    15   </filter-mapping>
    16   <filter-mapping>
    17       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    18       <url-pattern>*.js</url-pattern>
    19   </filter-mapping>
    20   <filter-mapping>
    21       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    22       <url-pattern>*.css</url-pattern>
    23   </filter-mapping>
    24   <filter-mapping>
    25       <filter-name>SetAllCharacterEncodingFilter</filter-name>
    26       <url-pattern>*.jsp</url-pattern>
    27   </filter-mapping>
    28   <filter>
    29       <filter-name>GzipFilter</filter-name>
    30       <filter-class>com.itheima.filter.GzipFilter</filter-class>
    31   </filter>
    32   <filter-mapping>
    33       <filter-name>GzipFilter</filter-name>
    34       <url-pattern>/*</url-pattern>
    35   </filter-mapping>
    36   <servlet>
    37     <servlet-name>ServletDemo1</servlet-name>
    38     <servlet-class>com.itheima.servlet.ServletDemo1</servlet-class>
    39   </servlet>
    40   <servlet>
    41     <servlet-name>ServletDemo2</servlet-name>
    42     <servlet-class>com.itheima.servlet.ServletDemo2</servlet-class>
    43   </servlet>
    44 
    45 
    46   <servlet-mapping>
    47     <servlet-name>ServletDemo1</servlet-name>
    48     <url-pattern>/servlet/ServletDemo1</url-pattern>
    49   </servlet-mapping>
    50   <servlet-mapping>
    51     <servlet-name>ServletDemo2</servlet-name>
    52     <url-pattern>/servlet/ServletDemo2</url-pattern>
    53   </servlet-mapping>    
    54   <welcome-file-list>
    55     <welcome-file>index.jsp</welcome-file>
    56   </welcome-file-list>
    57 </web-app>
    web.xml
    合群是堕落的开始 优秀的开始是孤行
  • 相关阅读:
    SQL Server之4:游标原理和使用方法
    .Net MVC3之2:前台异步获取json数据的实例(2)
    通过url读取页面内容
    SharePoint 在页面查看错误信息
    添加列表时修改Title字段报错
    滚动新闻
    视频列表
    自定义列表部署
    SharePoint 2010 使用”日历重叠“功能(转)
    沙盒解决方案与场解决方案之间的差异(转)
  • 原文地址:https://www.cnblogs.com/biaogejiushibiao/p/9334054.html
Copyright © 2020-2023  润新知