过滤器
什么是过滤器
1示意图:
过滤器的作用:
1.过滤器的作用好比一个保安。是servlet规范中的技术
2.用户在访问应用的资源之前或者之后,可以对请求做出一定的处理
编写过滤器步骤:
1.编写一个类,实现javax.servlet.Filter接口
2.配置过滤哪些资源 :修改web.xml配置要过滤的映射地址
3.让目标资源执行,放行:
1
2
3
4
5
6
7 /servlet/* *.jsp8 REQUEST(默认的) FROWARD INCLUDE ERROR9
配置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 importjava.io.Serializable;2
3 public class User implementsSerializable {4 privateString username;5 privateString password;6
7 publicUser(){}8
9 publicUser(String username, String password) {10 super();11 this.username =username;12 this.password =password;13 }14 publicString getUsername() {15 returnusername;16 }17 public voidsetUsername(String username) {18 this.username =username;19 }20 publicString getPassword() {21 returnpassword;22 }23 public voidsetPassword(String password) {24 this.password =password;25 }26
27 }
User
1 importjava.util.ArrayList;2 importjava.util.List;3
4 public classUserDB {5 private static List users = new ArrayList();6 static{7 users.add(new User("王斐", "123"));8 users.add(new User("王昭珽", "123"));9 }10 public staticUser findUser(String username,String password){11 for(User u:users){12 if(username.equals(u.getUsername())&&password.equals(u.getPassword())){13 returnu;14 }15 }16 return null;17 }18 public staticUser findUser(String username){19 for(User u:users){20 if(username.equals(u.getUsername())){21 returnu;22 }23 }24 return null;25 }26 }
UserDB
过滤器类:
1 importjava.io.IOException;2
3 importjavax.servlet.Filter;4 importjavax.servlet.FilterChain;5 importjavax.servlet.FilterConfig;6 importjavax.servlet.ServletException;7 importjavax.servlet.ServletRequest;8 importjavax.servlet.ServletResponse;9 importjavax.servlet.http.Cookie;10 importjavax.servlet.http.HttpServletRequest;11 importjavax.servlet.http.HttpServletResponse;12 importjavax.servlet.http.HttpSession;13
14 importcom.itheima.domain.User;15 importcom.itheima.domain.UserDB;16 importcom.itheima.util.Base64Util;17 importcom.itheima.util.MD5Util;18 //实现自动登录的过滤器
19 public class AutoLoginFilter implementsFilter {20 public voiddoFilter(ServletRequest req, ServletResponse resp,21 FilterChain chain) throwsIOException, 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
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) throwsServletException {59
60 }61
62 public voiddestroy() {63
64 }65
66 }
AutoLoginFilter
1 importjava.io.IOException;2
3 importjavax.servlet.Filter;4 importjavax.servlet.FilterChain;5 importjavax.servlet.FilterConfig;6 importjavax.servlet.ServletException;7 importjavax.servlet.ServletRequest;8 importjavax.servlet.ServletResponse;9 importjavax.servlet.http.HttpServletRequest;10 importjavax.servlet.http.HttpServletResponse;11 //动态资源不要缓存
12 public class DynamicResourceNoCacheFilter implementsFilter {13
14 public void init(FilterConfig filterConfig) throwsServletException {15
16 }17
18 public voiddoFilter(ServletRequest req, ServletResponse resp,19 FilterChain chain) throwsIOException, 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 voiddestroy() {37
38 }39
40 }
DynamicResourceNoCacheFilter
1 importjava.io.IOException;2
3 importjavax.servlet.Filter;4 importjavax.servlet.FilterChain;5 importjavax.servlet.FilterConfig;6 importjavax.servlet.ServletException;7 importjavax.servlet.ServletRequest;8 importjavax.servlet.ServletResponse;9 //解决POST请求参数和响应输出的编码过滤器
10 public class SetCharacterEncodingFilter implementsFilter {11 privateFilterConfig filterConfig;12 public void init(FilterConfig filterConfig) throwsServletException {13 this.filterConfig =filterConfig;14 }15
16 public voiddoFilter(ServletRequest request, ServletResponse response,17 FilterChain chain) throwsIOException, 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 voiddestroy() {30
31 }32
33 }
SetCharacterEncodingFilter
控制器类
1 importjava.io.IOException;2
3 importjavax.servlet.ServletException;4 importjavax.servlet.http.Cookie;5 importjavax.servlet.http.HttpServlet;6 importjavax.servlet.http.HttpServletRequest;7 importjavax.servlet.http.HttpServletResponse;8
9 importcom.itheima.domain.User;10 importcom.itheima.domain.UserDB;11 importcom.itheima.util.Base64Util;12 importcom.itheima.util.MD5Util;13
14 public class LoginServlet extendsHttpServlet {15
16 public voiddoGet(HttpServletRequest request, HttpServletResponse response)17 throwsServletException, 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 voiddoPost(HttpServletRequest request, HttpServletResponse response)44 throwsServletException, IOException {45 doGet(request, response);46 }47
48 }
LoginServlet
1 importjava.io.IOException;2
3 importjavax.servlet.ServletException;4 importjavax.servlet.http.HttpServlet;5 importjavax.servlet.http.HttpServletRequest;6 importjavax.servlet.http.HttpServletResponse;7
8 public class LogoutServlet extendsHttpServlet {9
10 public voiddoGet(HttpServletRequest request, HttpServletResponse response)11 throwsServletException, IOException {12 request.getSession().removeAttribute("user");13 response.getWriter().write("注销成功!2秒后转向主页");14 response.setHeader("Refresh", "2;URL="+request.getContextPath());15 }16
17 public voiddoPost(HttpServletRequest request, HttpServletResponse response)18 throwsServletException, IOException {19 doGet(request, response);20 }21
22 }
LogoutServlet
油条类:
1 importjava.security.MessageDigest;2 importjava.security.NoSuchAlgorithmException;3
4 importsun.misc.BASE64Encoder;5
6 public classMD5Util {7 public staticString md5(String str){8 try{9 MessageDigest md = MessageDigest.getInstance("MD5");10 byte b[] = md.digest("123".getBytes());//返回值是二进制,不一定对应着可见字符11 //数据指纹
12
13 String s = newBASE64Encoder().encode(b);14 returns;15 } catch(NoSuchAlgorithmException e) {16 throw newRuntimeException(e);17 }18 }19 }
MD5Util
1 importjava.io.IOException;2 importjava.io.UnsupportedEncodingException;3
4 importsun.misc.BASE64Decoder;5 importsun.misc.BASE64Encoder;6
7 public classBase64Util {8 public staticString base64encode(String str){9 BASE64Encoder base64 = newBASE64Encoder();10 String s1 = base64.encode(str.getBytes());//GBK
11 returns1;12 }13 public static String base64encode(String str,String charaset) throwsUnsupportedEncodingException{14 BASE64Encoder base64 = newBASE64Encoder();15 String s1 =base64.encode(str.getBytes(charaset));16 returns1;17 }18 public static String base64decode(String str) throwsIOException{19 BASE64Decoder base64 = newBASE64Decoder();20 byte b[] =base64.decodeBuffer(str);21 return new String(b);//GBK
22 }23 public static String base64decode(String str,String charaset) throwsIOException{24 BASE64Decoder base64 = newBASE64Decoder();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 importjava.io.IOException;2
3 importjavax.servlet.ServletException;4 importjavax.servlet.http.Cookie;5 importjavax.servlet.http.HttpServlet;6 importjavax.servlet.http.HttpServletRequest;7 importjavax.servlet.http.HttpServletResponse;8
9 importcom.itheima.domain.User;10 importcom.itheima.domain.UserDB;11 importcom.itheima.util.Base64Util;12 importcom.itheima.util.MD5Util;13
14 public class LoginServlet extendsHttpServlet {15
16 public voiddoGet(HttpServletRequest request, HttpServletResponse response)17 throwsServletException, 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 voiddoPost(HttpServletRequest request, HttpServletResponse response)44 throwsServletException, IOException {45 doGet(request, response);46 }47
48 }
LoginServlet
1 importjava.security.MessageDigest;2 importjava.security.NoSuchAlgorithmException;3
4 importsun.misc.BASE64Encoder;5
6 public classMD5Util {7 public staticString md5(String str){8 try{9 MessageDigest md = MessageDigest.getInstance("MD5");10 byte b[] = md.digest("123".getBytes());//返回值是二进制,不一定对应着可见字符11 //数据指纹
12
13 String s = newBASE64Encoder().encode(b);14 returns;15 } catch(NoSuchAlgorithmException e) {16 throw newRuntimeException(e);17 }18 }19 }
MD5Util
1 importjava.io.IOException;2 importjava.io.UnsupportedEncodingException;3
4 importsun.misc.BASE64Decoder;5 importsun.misc.BASE64Encoder;6
7 public classBase64Util {8 public staticString base64encode(String str){9 BASE64Encoder base64 = newBASE64Encoder();10 String s1 = base64.encode(str.getBytes());//GBK
11 returns1;12 }13 public static String base64encode(String str,String charaset) throwsUnsupportedEncodingException{14 BASE64Encoder base64 = newBASE64Encoder();15 String s1 =base64.encode(str.getBytes(charaset));16 returns1;17 }18 public static String base64decode(String str) throwsIOException{19 BASE64Decoder base64 = newBASE64Decoder();20 byte b[] =base64.decodeBuffer(str);21 return new String(b);//GBK
22 }23 public static String base64decode(String str,String charaset) throwsIOException{24 BASE64Decoder base64 = newBASE64Decoder();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 packagecom.base;2
3 importjava.io.BufferedReader;4 importjava.io.FileReader;5 importjava.io.IOException;6 importjava.io.Reader;7
8 public classBufferedReaderDemo {9
10 publicBufferedReaderDemo() {11 //TODO Auto-generated constructor stub
12 }13
14 public static void main(String[] args) throwsIOException {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=newMyBufferedReader(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 packagecom.base;2
3 importjava.io.BufferedReader;4 importjava.io.IOException;5
6 public class MyBufferedReader extendsBufferedReader {7 privateBufferedReader br;8 private int num=1;9
10 publicMyBufferedReader(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() throwsIOException{19 String data=br.readLine();20 if(data!=null){21 data=num+++data;22 }23 returndata;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 packagecom.itheima.filter;2
3 importjava.io.IOException;4 importjava.io.UnsupportedEncodingException;5
6 importjavax.servlet.Filter;7 importjavax.servlet.FilterChain;8 importjavax.servlet.FilterConfig;9 importjavax.servlet.ServletException;10 importjavax.servlet.ServletRequest;11 importjavax.servlet.ServletResponse;12 importjavax.servlet.http.HttpServletRequest;13 importjavax.servlet.http.HttpServletRequestWrapper;14 importjavax.servlet.http.HttpServletResponse;15 //解决GET和POST请求参数和响应输出的编码过滤器
16 public class SetAllCharacterEncodingFilter implementsFilter {17 privateFilterConfig filterConfig;18 public void init(FilterConfig filterConfig) throwsServletException {19 this.filterConfig =filterConfig;20 }21
22 public voiddoFilter(ServletRequest req, ServletResponse resp,23 FilterChain chain) throwsIOException, 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 = newMyHttpServletRequest(request);41 chain.doFilter(mrequest, response);42 }43
44 public voiddestroy() {45
46 }47
48 }49 class MyHttpServletRequest extendsHttpServletRequestWrapper{50 privateHttpServletRequest request;51 publicMyHttpServletRequest(HttpServletRequest request){52 super(request);53 this.request =request;54 }55 publicString getParameter(String name) {56 String value =request.getParameter(name);57 if(value==null)58 returnvalue;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 returnvalue;66 }67
68 }
SetAllCharacterEncodingFilter
1 <?xml version="1.0" encoding="UTF-8"?>
2
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/javaee6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
7
8
9 SetAllCharacterEncodingFilter
10 com.itheima.filter.SetAllCharacterEncodingFilter
11
12
13 SetAllCharacterEncodingFilter
14 /*
15
16
17 index.jsp
18
19
web.xml
脏话过滤器
1 importjava.io.IOException;2
3 importjavax.servlet.Filter;4 importjavax.servlet.FilterChain;5 importjavax.servlet.FilterConfig;6 importjavax.servlet.ServletException;7 importjavax.servlet.ServletRequest;8 importjavax.servlet.ServletResponse;9 importjavax.servlet.http.HttpServletRequest;10 importjavax.servlet.http.HttpServletRequestWrapper;11 importjavax.servlet.http.HttpServletResponse;12
13 public class DirtyWordsFilter implementsFilter {14
15 public void init(FilterConfig filterConfig) throwsServletException {16
17 }18
19 public voiddoFilter(ServletRequest req, ServletResponse resp,20 FilterChain chain) throwsIOException, 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 = newDirtyWordHttpServletRequest(request);30 chain.doFilter(dwrequest, response);31
32
33 }34
35 public voiddestroy() {36
37 }38
39 }40 class DirtyWordHttpServletRequest extendsHttpServletRequestWrapper{41 private String strs[] = {"傻逼","畜生","禽兽"};42 privateHttpServletRequest request;43 publicDirtyWordHttpServletRequest(HttpServletRequest request){44 super(request);45 this.request =request;46 }47 @Override48 publicString 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 returnvalue;58 }59
60 }
DirtyWordsFilter
1 <?xml version="1.0" encoding="UTF-8"?>
2
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/javaee6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
7
8
9 SetAllCharacterEncodingFilter
10 com.itheima.filter.SetAllCharacterEncodingFilter
11
12
13 SetAllCharacterEncodingFilter
14 /*
15
16
17
18 DirtyWordsFilter
19 com.itheima.filter.DirtyWordsFilter
20
21
22 DirtyWordsFilter
23 /*
24
25
26
27 index.jsp
28
29
web.xml
HTML标记过滤器
1 importjava.io.IOException;2
3 importjavax.servlet.Filter;4 importjavax.servlet.FilterChain;5 importjavax.servlet.FilterConfig;6 importjavax.servlet.ServletException;7 importjavax.servlet.ServletRequest;8 importjavax.servlet.ServletResponse;9 importjavax.servlet.http.HttpServletRequest;10 importjavax.servlet.http.HttpServletRequestWrapper;11 importjavax.servlet.http.HttpServletResponse;12
13 public class HtmlFilter implementsFilter {14
15 public void init(FilterConfig filterConfig) throwsServletException {16
17 }18
19 public voiddoFilter(ServletRequest req, ServletResponse resp,20 FilterChain chain) throwsIOException, 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 = newHtmlHttpServletRequest(request);31 chain.doFilter(hrequest, response);32
33 }34
35 public voiddestroy() {36
37 }38
39 }40 class HtmlHttpServletRequest extendsHttpServletRequestWrapper{41 privateHttpServletRequest request;42 publicHtmlHttpServletRequest(HttpServletRequest request){43 super(request);44 this.request =request;45 }46 @Override47 publicString getParameter(String name) {48 String value =request.getParameter(name);49 if(value==null)50 return null;51 value =htmlFilter(value);52 returnvalue;53 }54 privateString 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 '':67 result.append(">");68 break;69 case '&':70 result.append("&");71 break;72 case '"':73 result.append(""");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
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/javaee6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
7
8
9 SetAllCharacterEncodingFilter
10 com.itheima.filter.SetAllCharacterEncodingFilter
11
12
13 SetAllCharacterEncodingFilter
14 /*
15
16
17
18 DirtyWordsFilter
19 com.itheima.filter.DirtyWordsFilter
20
21
22 DirtyWordsFilter
23 /*
24
25
26 HtmlFilter
27 com.itheima.filter.HtmlFilter
28
29
30 HtmlFilter
31 /*
32
33
34 ServletDemo1
35 com.itheima.servlet.ServletDemo1
36
37
38
39 ServletDemo1
40 /servlet/ServletDemo1
41
42
43 index.jsp
44
45
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 importjava.io.IOException;2 importjava.io.UnsupportedEncodingException;3
4 importjavax.servlet.Filter;5 importjavax.servlet.FilterChain;6 importjavax.servlet.FilterConfig;7 importjavax.servlet.ServletException;8 importjavax.servlet.ServletRequest;9 importjavax.servlet.ServletResponse;10 importjavax.servlet.http.HttpServletRequest;11 importjavax.servlet.http.HttpServletRequestWrapper;12 importjavax.servlet.http.HttpServletResponse;13 //解决GET和POST请求参数和响应输出的编码过滤器
14 public class SetAllCharacterEncodingFilter implementsFilter {15 privateFilterConfig filterConfig;16 public void init(FilterConfig filterConfig) throwsServletException {17 this.filterConfig =filterConfig;18 }19
20 public voiddoFilter(ServletRequest req, ServletResponse resp,21 FilterChain chain) throwsIOException, 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 = newMyHttpServletRequest(request);40 chain.doFilter(mrequest, response);41 }42
43 public voiddestroy() {44
45 }46
47 }48 class MyHttpServletRequest extendsHttpServletRequestWrapper{49 privateHttpServletRequest request;50 publicMyHttpServletRequest(HttpServletRequest request){51 super(request);52 this.request =request;53 }54 publicString getParameter(String name) {55 String value =request.getParameter(name);56 if(value==null)57 returnvalue;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 returnvalue;65 }66
67 }
SetAllCharacterEncodingFilter
控制器:Servlet
1 importjava.io.ByteArrayOutputStream;2 importjava.io.IOException;3 importjava.util.zip.GZIPOutputStream;4
5 importjavax.servlet.ServletException;6 importjavax.servlet.ServletOutputStream;7 importjavax.servlet.http.HttpServlet;8 importjavax.servlet.http.HttpServletRequest;9 importjavax.servlet.http.HttpServletResponse;10 //gzip压缩输出
11 public class ServletDemo1 extendsHttpServlet {12
13 public voiddoGet(HttpServletRequest request, HttpServletResponse response)14 throwsServletException, IOException {15 String data = "
中中
";16 ServletOutputStream sos =response.getOutputStream();17 sos.write(data.getBytes("UTF-8"));1819
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 voiddoPost(HttpServletRequest request, HttpServletResponse response)39 throwsServletException, IOException {40 doGet(request, response);41 }42
43 }
ServletDemo1
1 importjava.io.IOException;2 importjava.io.PrintWriter;3
4 importjavax.servlet.ServletException;5 importjavax.servlet.http.HttpServlet;6 importjavax.servlet.http.HttpServletRequest;7 importjavax.servlet.http.HttpServletResponse;8
9 public class ServletDemo2 extendsHttpServlet {10
11 public voiddoGet(HttpServletRequest request, HttpServletResponse response)12 throwsServletException, IOException {13 String data = "你dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd";14 PrintWriter out =response.getWriter();15 out.write(data);16 }17
18 public voiddoPost(HttpServletRequest request, HttpServletResponse response)19 throwsServletException, IOException {20 doGet(request, response);21 }22
23 }
ServletDemo2
配置文件:web.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2
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/javaee6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
7
8
9 SetAllCharacterEncodingFilter
10 com.itheima.filter.SetAllCharacterEncodingFilter
11
12
13 SetAllCharacterEncodingFilter
14 *.html
15
16
17 SetAllCharacterEncodingFilter
18 *.js
19
20
21 SetAllCharacterEncodingFilter
22 *.css
23
24
25 SetAllCharacterEncodingFilter
26 *.jsp
27
28
29 GzipFilter
30 com.itheima.filter.GzipFilter
31
32
33 GzipFilter
34 /*
35
36
37 ServletDemo1
38 com.itheima.servlet.ServletDemo1
39
40
41 ServletDemo2
42 com.itheima.servlet.ServletDemo2
43
44
45
46
47 ServletDemo1
48 /servlet/ServletDemo1
49
50
51 ServletDemo2
52 /servlet/ServletDemo2
53
54
55 index.jsp
56
57
web.xml