Live2d Test Env

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
posted @ 2018-07-19 10:23  麦奇  阅读(449)  评论(0编辑  收藏  举报