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>
过滤器的生命周期
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 }
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 }
过滤器类:
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 }
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 }
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 }
控制器类
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 }
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 }
油条类:
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 }
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 }
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 }
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 }
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 }
过滤器的高级配置
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 }
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 }
过滤器的高级案例
解决全站中文乱码过滤器(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 }
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>
脏话过滤器
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 }
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>
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("<"); 65 break; 66 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 }
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>
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 }
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 }
控制器: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 }
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 }
配置文件: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>