java web过滤器_JavaWeb之过滤器

过滤器

什么是过滤器

1示意图:

071021a5d2dac47920ea341a689826cb.png

过滤器的作用:

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

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

编写过滤器步骤:

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

9c0b2a73e5a31bef3a9109beb1763473.png

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

b21cdc40028cf4cb78e9c324df282ee9.png

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

1255cab67905ad0e77e099c127f19021.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1

2

3

4

5

6

7 /servlet/* *.jsp8 REQUEST(默认的) FROWARD INCLUDE ERROR9

配置web.xml,指定哪些资源需要过滤

过滤器的生命周期

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

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

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

过滤器的过滤顺序

1.责任设计模式:

8202a40495806c2289a12a6acbfaa14d.png

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

729cb9fd2778c313af41075a7fc5ba5a.png

6b8a78639c611aa12f51e60f50e07a36.png

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

Servlet VS Filter:

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

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

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

Struct2框架:Filter作为控制器

3d40537ed3c8bb39e308088770f1e269.png

过滤器的简单案例:

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

875a09dc6351dbeeb1e50ea6c05e751c.png

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

60e4f8ed8968bf0db63fba9a642a92e6.png

web.xml配置文件:

48a3ba9841cb66fd2e5604fca8d4d0f2.png

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

93c4fb7686b38431dd6e3abf39106469.png

44fb5887b73706a65c72db81875f993a.png

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

8100c46280e63b505686d177d7c7a69b.png

962d47394cf0857d56fe3e046aceb7c6.png

自动登入过滤器案例

实体类:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

过滤器类:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

控制器类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

油条类:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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加密密码的问题:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

过滤器的高级配置

13bbf4ec056e4e5d48049bdc90a7e4f5.png

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

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

7d8c816447bda0512dbc640041368510.png

9f4098840cadff43f544c5ce51a7133d.png

巩固装饰设计模式

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

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

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

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

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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):

588ff0fba6035bf274f14d54c056a06a.png

f8573fbd60dfc25b32dc9e0102e9f7fb.png

案例撸上:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

脏话过滤器

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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标记过滤器

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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压缩过滤器

11c44219b582fa2a9e479aca7738cefa.png

过滤器:Filter

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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"));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 voiddoPost(HttpServletRequest request, HttpServletResponse response)39 throwsServletException, IOException {40 doGet(request, response);41 }42

43 }

ServletDemo1

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值