JavaWeb-19 (JDBC之过滤器Filter)

JavaWeb-19

JDBC之过滤器Filter

一、Filter过滤器概述

Filter(过滤器):Web三大组件之一,就是对目标资源进行请求前或请求后.

Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

实际中:过滤器就相当于山大王,作用就是拦截,拦截不拦截,山大王说的算

查看java Servlet文档去查看Filter解释

作用? 实例: 1、动态资源不缓存 2、静态资源缓存 3、中文乱码集中处理 4、特殊字符过滤 5、全站压缩(选做) 6、脚本过滤

  • 写法?

    1、写类:

    类 implements Filter
        init(FilterConfig)
        doFilter(ServletRequest,ServletResponse,FilterChain)
        destory()
    
    在其他里寻找Filter类型的文件来新建,因为这样web.xml可以自动配置,和Servlet一样。
    
    在新建栏里有初始化参数栏(encoding:UTF-8) 还有一个映射栏(filter mappings:  /*:代表过滤所有资源),或者在里面写具体的资源,那么就只拦截具体的资源                    
    
    配置web.xml:由于在新建选择了新建Filter类型的文件,MyEclipse会自动配置web.xml
    
    在服务器启动时,filter已经实例化了,证明filter的生命周期比servlet长,不要直接访问过滤器。
    
    在IE里尝试访问index.jsp
    
    通过web.xml里的设置,会在访问index.jsp里导致filter里的方法执行。
    

    2、在web.xml中进行配置.

    格式!!
    

    3、对于Filter中的doFilter与FilterChain中的doFilter的比较?

    a、个数不同
    
        Filter接口doFilter是3个参数ServletRequset,ServletResponse,FilterChain
        FilterChain参数2个:ServletRequset,ServletResponse
    
    b、作用不同
    
        Filter接口doFilter拦截作用
        FilterChain接口中的doFilter起放行作用。
    

二、Filter过滤器链执行顺序

1、过滤器一般就是起拦截作用的,不要直接访问过滤器

2、生命周期

1、容器启动时,Filter就会进行实例化(构造方法),初始化(init)--->只有一次机会

2、以后每次访问目标资源时,在符合条件的情况下,过滤器执行doFilter()进行拦截。

3、当应用被卸载或服务停止时,destory()被执行---->只有一次机会

3、拦截的顺序问题?

有多个过滤器就会形成一个(过滤器链),先执行第一个过滤器,再执行第二个过滤器

顺序取决于在web.xml中配置的顺序,看filter-mapping先后顺序,filter-mapping前先过滤。

<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/a</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>DirtyWordsFilter</filter-name>
    <url-pattern>/b</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>HtmlFilter</filter-name>
    <url-pattern>/c</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>GzipFilter</filter-name>
    <url-pattern>/d</url-pattern>
  </filter-mapping>

比如上面的web.xml配置文件所配置的Filter执行顺序是:CharacterEncodingFilter-->DirtyWordsFilter-->HtmlFilter-->GzipFilter

三、获取初始化参数

1、配置时

1、/路径名/*    (/*)
2、*.扩展名        (*.jsp)
3、具体路径        (/add.jsp)

2、一个过滤器可以有多个过滤路径

 <filter-mapping>
    <filter-name>filterDemo1</filter-name>
    <url-pattern>/add.jsp</url-pattern>
  </filter-mapping>
   <filter-mapping>
    <filter-name>filterDemo1</filter-name>
    <url-pattern>/login.jsp</url-pattern>
  </filter-mapping>

3、对于初始化参数的配置及读取(FliterConfig)

            /*
    <init-param>
      <param-name>encoding</param-name>
      <param-value>GBK</param-value>
    </init-param>
 */
    //得到一个参数
    /*String value = config.getInitParameter("encoding");
    System.out.println(value);
    chain.doFilter(request, response);*/

    //得到多个参数
    Enumeration<String> enums = config.getInitParameterNames();
    while(enums.hasMoreElements()){
            String paramName = enums.nextElement();
            String paramValue = config.getInitParameter(paramName);
            System.out.println(paramName+":"+paramValue);

filter讲解:

filterChain讲解

项目:day1900filter

项目架构:

FilterDemo1.java.

package com.itheima.filter;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterDemo1 implements Filter {
    private FilterConfig config;//用于读取初始化参数  <init-param>中的值
    public FilterDemo1() {
        System.out.println("FilterDemo1被实例化了");
    }

    public void destroy() {
        System.out.println("FilterDemo1被销毁了");
    }

    //拦截,放行
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        /*
         * <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
        String value = config.getInitParameter("encoding");
        System.out.println(value);
         */

        Enumeration<String> enumss = config.getInitParameterNames();//取到所有参数名称  <param-name>encoding</param-name>
        while(enumss.hasMoreElements()){
            String paramName = enumss.nextElement();
            String value = config.getInitParameter(paramName);
            System.out.println(value);
        }
        System.out.println("FilterDemo1放行前");
        response.getWriter().write("FilterDemo1放行前前");
        chain.doFilter(request, response);//放行
        System.out.println("FilterDemo1放行后");
    }

    public void init(FilterConfig fConfig) throws ServletException {
        this.config = fConfig;
        System.out.println("初始化了");
    }

}

FilterDemo2.java

package com.itheima.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet Filter implementation class FilterDemo2
 */
public class FilterDemo2 implements Filter {

    /**
     * Default constructor.
     */
    public FilterDemo2() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("FilterDemo2放行前");
        chain.doFilter(request, response);
        System.out.println("FilterDemo2放行后");
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="http://blog.163.com/faith_yee/blog/<%=basePath%>">

    <title>My JSP ‘index.jsp‘ starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/styles.css">
    -->
  </head>

  <body>
    This is my JSP page. <br>
    <%
        System.out.println("目标资源:JSP");
     %>
  </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name></display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <filter-name>FilterDemo1</filter-name>
    <filter-class>com.itheima.filter.FilterDemo1</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>name</param-name>
      <param-value>AJ</param-value>
    </init-param>
  </filter>

  <filter>
    <display-name>FilterDemo2</display-name>
    <filter-name>FilterDemo2</filter-name>
    <filter-class>com.itheima.filter.FilterDemo2</filter-class>

  </filter>
  <filter-mapping>
    <filter-name>FilterDemo2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

   <filter-mapping>
    <filter-name>FilterDemo1</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

测试:

总结:在filter里如何获得web.xml配置文件的属性值:

由于之前例子发现filter在服务器启动时就已经进行配置文件初始化了,所以自然会执行filter的构造函数和init的方法,该方法的参数是FilterConfig类型,init()方法会读取配置文件给该filter进行初始化,所以我们可以从该方法入手获取FilterConfig类型变量,首先我们定义一个FilterConfig类型的全局变量,然后通过init()方法进行传值到全局变量,然后全局变量就可以获得FilterConfig类型的对象,然后可以执行对象中的方法getInitParameterNames()或getInitParameter()去获取配置文件的属性名或属性值。

四、过滤器解决乱码问题简单版

三个示例:

1、编码过滤
2、动态资源无缓存
3、静态资源缓存

实例 servlet解决乱码:

1、取名
2、输出回jsp,测试有没有乱码

用filter解决编码的问题(集中问题解决)
思考:以后执行servlet时,都通过filter过滤,那么就可以都解决编码乱码的问题了

总结:如果要集中解决问题:用过滤器

五、动态资源不缓存的过滤器

过滤器解决post的乱码

待会再讲解get提交的代码

在dofilter里对强转request和response成HttpServlet的 //以上的技巧叫调包!!在过滤器里经常使用

开始设置不缓存

response.setHeader("Expirse","-1");
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma","no-cache");

测试:在IE里访问addcustomer.jsp

在IE设置里查看缓存,找到目标后查看文件的过期时间!!对比本地时间去判断!

以此实现动态资源不缓存

六、静态资源缓存的过滤器

然后在过滤器里进一步筛选

在该过滤器的配置器里加参数属性进行筛选 配置文件

思路:

1、因为静态资源过多,所以配置成/**/,但为了只过滤静态资源,所以考虑用参数来区分

2、读取初始化参数,
        {
            那么我们怎么知道客户端访问的路径是什么?
            2、得到用户访问的资源(主要取它的类型,而文件类型由扩展名决定,然后把调包方式复制过来),用来获取后缀名

        }
    读取初始化参数,以找到这个类型的资源缓存时间
3、设置缓存时间
    response.setDateHeader("Expires",System.currentTimeMillis()+Integer.parseInt(time)+60*60*1000);

测试:在测试前准备一些静态资源: 访问index.html-->里面会访问静态资源: 然后去IE设置文件里查看缓存过期时间

项目:day1901filterExample:CharacterEncodingFilter

项目架构:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name></display-name>
  <servlet>
    <servlet-name>UserRegistServlet</servlet-name>
    <servlet-class>com.itheima.servlet.UserRegistServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>CustomerRegistServlet</servlet-name>
    <servlet-class>com.itheima.servlet.CustomerRegistServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UserRegistServlet</servlet-name>
    <url-pattern>/servlet/UserRegistServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>CustomerRegistServlet</servlet-name>
    <url-pattern>/servlet/CustomerRegistServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <display-name>CharacterEncodingFilter</display-name>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.itheima.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>DyncSourceNoNeedCache</display-name>
    <filter-name>DyncSourceNoNeedCache</filter-name>
    <filter-class>com.itheima.filter.DyncSourceNoNeedCache</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>DyncSourceNoNeedCache</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>DyncSourceNoNeedCache</filter-name>
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>StaticSourceNeedCache</display-name>
    <filter-name>StaticSourceNeedCache</filter-name>
    <filter-class>com.itheima.filter.StaticSourceNeedCache</filter-class>
    <init-param>
        <param-name>html</param-name>
        <param-value>1</param-value><!-- 小时 -->
    </init-param>
    <init-param>
        <param-name>css</param-name>
        <param-value>2</param-value><!-- 小时 -->
    </init-param>
    <init-param>
        <param-name>js</param-name>
        <param-value>3</param-value><!-- 小时 -->
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>StaticSourceNeedCache</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

CharacterEncodingFilter.java

package com.itheima.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet Filter implementation class CharacterEncodingFilter
 */
public class CharacterEncodingFilter implements Filter {

    /**
     * Default constructor.
     */
    public CharacterEncodingFilter() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");//post提交有效
        response.setCharacterEncoding("UTF-8");//响应结果的编码
        response.setContentType("text/html;charset=UTF-8");//告诉浏览器用什么编码,它也有上一行代码的功能

        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

}

DyncSourceNoNeedCache.java

package com.itheima.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class DyncSourceNoNeedCache
 */
public class DyncSourceNoNeedCache implements Filter {

    /**
     * Default constructor.
     */
    public DyncSourceNoNeedCache() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request ;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) resp;

            //调包
            response.setHeader("Expires", "-1");
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Pragma", "no-cache");

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("non-http request or response");
        }
        chain.doFilter(request, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}

StaticSourceNeedCache.java

package com.itheima.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class StaticSourceNeedCache implements Filter {
    private FilterConfig config;
    public StaticSourceNeedCache() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        //1.因为静态资源过多,所以配置成/*,但为了只过滤静态资源,所以考虑用参数来区分
        HttpServletRequest request ;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) resp;

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("non-http request or response");
        }
        //2.得到用户访问的资源(主要取它的类型,而文件类型由扩展名决定)
        String path = request.getRequestURI();//资源名    /dsfdsfsdfds/dsfdsfs/a.html
        String extensionName = path.substring(path.lastIndexOf(".")+1);//得到扩展名
        //3.读取初始化参数,以找到这个类型的资源缓存时间
        String time ="0";
        String time1 = config.getInitParameter(extensionName);
        if(time1!=null){
            time = time1;
        }

        //4.设置缓存时间
        response.setDateHeader("Expires", System.currentTimeMillis()+Integer.parseInt(time)*60*60*1000);//单位:毫秒

        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
        this.config = fConfig;
    }

}

CustomerRegistServlet.java

package com.itheima.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CustomerRegistServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*request.setCharacterEncoding("UTF-8");//post提交有效
        response.setCharacterEncoding("UTF-8");//响应结果的编码
        response.setContentType("text/html;charset=UTF-8");//告诉浏览器用什么编码,它也有上一行代码的功能
*/
        String value = request.getParameter("name");
        response.getWriter().write(value);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);

    }

}

UserRegistServlet.java

package com.itheima.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserRegistServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    /*  request.setCharacterEncoding("UTF-8");//post提交有效
        response.setCharacterEncoding("UTF-8");//响应结果的编码
        response.setContentType("text/html;charset=UTF-8");//告诉浏览器用什么编码,它也有上一行代码的功能
*/
        String value = request.getParameter("name");
        response.getWriter().write(value);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);

    }

}

addCustomer.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>客户注册</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/styles.css">
    -->

  </head>

  <body>
    <form action="${pageContext.request.contextPath}/servlet/CustomerRegistServlet" method="post">
        <input name="name"/><input type="submit" value="保存"/>
    </form>
  </body>
</html>

addUser.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>用户注册</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/styles.css">
    -->

  </head>

  <body>
    <form action="${pageContext.request.contextPath}/servlet/UserRegistServlet" method="post">
        <input name="name"/><input type="submit" value="保存"/>
    </form>
  </body>
</html>

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>index.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/css/main.css">
    <script type="text/javascript" src="http://blog.163.com/faith_yee/blog/js/1.js"></script>
  </head>

  <body>
    hello ,good morning.
  </body>
</html>

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="http://blog.163.com/faith_yee/blog/<%=basePath%>">

    <title>My JSP ‘index.jsp‘ starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/styles.css">
    -->
  </head>

  <body>
    This is my JSP page. <br>
  </body>
</html>

测试addCustomer

测试addUser

测试 DyncSourceNoNeedCache

测试 StaticSourceNeedCache

七、自动登录

示例4、自动登录

分析资料:

项目:day1902autoLogin

项目架构:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name></display-name>
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.itheima.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/servlet/LoginServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <display-name>CharacterEncodingFilter</display-name>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.itheima.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>AutoLoginFilter</display-name>
    <filter-name>AutoLoginFilter</filter-name>
    <filter-class>com.itheima.filter.AutoLoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AutoLoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

User.java

package com.itheima.domain;

import java.io.Serializable;

public class User implements Serializable {
    private String username;
    private String password;

    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }

    public User() {
        super();
    }

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}

UserDB.java

package com.itheima.domain;

import java.util.ArrayList;
import java.util.List;

public class UserDB {
    private static List<User> users = new ArrayList<User>();
    static{
        users.add(new User("郭女士","123"));
        users.add(new User("丁先生","123"));
        users.add(new User("fj","123"));
    }

    public static User findUser(String username,String password){
        for(User u:users){
            if(username.equals(u.getUsername())&&password.equals(u.getPassword())){
                return u;
            }
        }
        return null;
    }

    public static User findUser(String username){
        for(User u:users){
            if(username.equals(u.getUsername())){
                return u;
            }
        }
        return null;
    }

}

AutoLoginFilter.java

package com.itheima.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itheima.domain.User;
import com.itheima.domain.UserDB;
import com.itheima.util.Base64Util;
import com.itheima.util.Md5Util;

/**
 * Servlet Filter implementation class AutoLoginFilter
 */
public class AutoLoginFilter implements Filter {

    /**
     * Default constructor.
     */
    public AutoLoginFilter() {
        // TODO Auto-generated constructor stub
    }

    public void destroy() {

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //读取session中的值
        User u = (User)request.getSession().getAttribute("user");
        if(u==null){
            //2.没有登录,可以读Cookie
            Cookie cs [] = request.getCookies();

            //3.遍历
            if(cs==null){
                return ;
            }

            Cookie userCookie = null;
            if(cs!=null && cs.length>0){
                for (int i = 0; i < cs.length; i++) {
                    Cookie c = cs[i];
                    if("userinfo".equals(c.getName())){
                        //如果找到了你想的cookie
                        userCookie = c;
                        break;
                    }
                }
            }

            //4.说明存在要找的Cookie
            if(userCookie!=null){
                String username_pwd = userCookie.getValue();
                String b64username = username_pwd.split("_")[0];//取b64编码后的用户名
                String md5pwd = username_pwd.split("_")[1];//取md5加密后的密码

                //5.还原用户名
                String trueUsername = Base64Util.decode(b64username);
                //6.根据用户名,到UserDB中查找,得到一个User对象
                User uu = UserDB.findUser(trueUsername);
                if(uu!=null){
                    if(md5pwd.equals(Md5Util.encode(uu.getPassword()))){
                        request.getSession().setAttribute("user", uu);
                    }
                }
            }
        }
        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {

    }

}

CharacterEncodingFilter.java

package com.itheima.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet Filter implementation class CharacterEncodingFilter
 */
public class CharacterEncodingFilter implements Filter {

    /**
     * Default constructor.
     */
    public CharacterEncodingFilter() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");//post提交有效
        response.setCharacterEncoding("UTF-8");//响应结果的编码
        response.setContentType("text/html;charset=UTF-8");//告诉浏览器用什么编码,它也有上一行代码的功能

        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

}

LoginServlet.java

package com.itheima.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itheima.domain.User;
import com.itheima.domain.UserDB;
import com.itheima.util.Base64Util;
import com.itheima.util.Md5Util;

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1.获取参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String expires = request.getParameter("expires");
        //2.验证用户的合法性
        User u = UserDB.findUser(username, password);
        //3.判断是非法用户,直接返回到登录页
        if(u==null){
            response.getWriter().write("登录失败,2秒后请重新登录");
            response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/login.jsp");
            return;
        }
        //4.合法用户,将用户信息存入session
        request.getSession().setAttribute("user", u);
        //5.产生一个Cookie,用于保存登录用户的用户名_密码   (base64username_md5password)
        Cookie c = new Cookie("userinfo",Base64Util.encode(u.getUsername())+"_"+Md5Util.encode(u.getPassword()));
        //6.设置cookie的path路径
        c.setPath(request.getContextPath());//代表当前应用请求时,cookie信息都发送给服务器
        //7.设置cookie的存活时间
        if("never".equals(expires)){
            c.setMaxAge(0);
        }else if("month".equals(expires)){
            c.setMaxAge(30*24*60*60);//秒
        }else if("year".equals(expires)){
            c.setMaxAge(365*24*60*60);
        }else if("forever".equals(expires)){
            c.setMaxAge(Integer.MAX_VALUE);
        }
        //8.发送给浏览器
        response.addCookie(c);
        //9重定向到index.jsp
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);

    }

}

Base64Util.java

package com.itheima.util;

import java.io.IOException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Util {

    //编码
    public static String encode(String oldStr){
        BASE64Encoder b64Encoder = new BASE64Encoder();
        return b64Encoder.encode(oldStr.getBytes());
    }

    //解码
    public static String decode(String oldStr){
        try {
            BASE64Decoder b64Decoder = new BASE64Decoder();
            byte []newStr =  b64Decoder.decodeBuffer(oldStr);
            return new String(newStr);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

Md5Util.java

package com.itheima.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Encoder;

public class Md5Util {
    public static String encode(String oldStr){
        try {
            MessageDigest md5 = MessageDigest.getInstance("md5");
            byte [] newStr = md5.digest(oldStr.getBytes());

            BASE64Encoder b64 = new BASE64Encoder();
            return b64.encode(newStr);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static void main(String[] args) {
        for(int i=1;i<20;i++){
        String newString = Md5Util.encode("abc"+i);
        System.out.println(newString);
        }
    }
}

bbs.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title></title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    

  </head>

  <body>
    ${sessionScope.user.username}
  </body>
</html>

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>XX网站</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/styles.css">
    -->
  </head>

  <body>
        <c:if test="${sessionScope.user==null}">
            <a href="http://blog.163.com/faith_yee/blog/${pageContext.request.contextPath}/login.jsp">登录</a>
        </c:if>
        <c:if test="${sessionScope.user!=null}">
            欢迎您:${user.username}<a href="http://blog.163.com/faith_yee/blog/#">注销</a>
        </c:if>
        <hr/>
        XX网站
        <a href="http://blog.163.com/faith_yee/blog/${pageContext.request.contextPath}/bbs.jsp">帖子</a>
  </body>
</html>

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title></title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    

  </head>

  <body>
    <form action="${pageContext.request.contextPath}/servlet/LoginServlet" method="post">
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        登录有效期:<input type="radio" name="expires" value="never" checked="checked">无
                <input type="radio" name="expires" value="month">一个月
                <input type="radio" name="expires" value="year">一年
                <input type="radio" name="expires" value="forever">永久<br/>
        <input type="submit" value="登录"/>
    </form>
  </body>
</html>

测试:

util-->Base64Util

//编码
public static String encode(oldStr){
    BASE64Encoder b64Encode = new BASE64Encoder();
    return b64Encoder.encode(oldStr.getBytes());
}

//解码
public static String decode(String oldStr){
    BASE64Decoder b64Decoder = new BASE64Decoder();
    byte []newStr =  b64Decoder.decodeBuffer(oldStr);//stream类型
    return new String(newStr);
}

该工具类把用户名编码进行编码传输!

util--->Md5Util

Md5不可逆

public static String encode (String oldStr){
    MessageDigest md5 = MessageDigest.getInstance("md5");
    byte[] newStr = md5.digest(oldStr.getBytes());
    //return new String (newStr);

    //以上这种加密不好使,会产生一些无厘头的中文,所以为了传输这md5产生的加密文件,所以结合上面的Base64util来给加密文件都进行编码!!传输到另一方进行解码!!

}

测试工具类

以上主要是为了通过客户端发来用户名和密码,发送给客户端,通过md5把密码加密后传输到服务器端,服务器端经过匹配md5加密后的密码去取出数据库中的用户资料,这个传输过程使用base64编码解码进行传输。。

Base64Util是3字节变成4字节

八、实例

1、全站编码过滤器

问题是,我们输入的那么多jsp,怎么弄一个功能更强大的filter去解决get/post的乱码问题

在web.xml里加上<init-param>属性配置

改进CHaracterEncodingFilter

把代码写活,适用型强

调包-->新类MyHttpServletRequset(内部类):!!!调包后换了一个功能更强大的

包装设计模式

2、包装设计模式解释

包装设计模式

MyBufferReader extends BufferdReader{
    private BufferedReader reader ;
    public MyBufferedReader(Reader in){
        super(in);
        this.reader =(BufferedReader)in;
    }
    public String readLine() throws IOException{
        String content = reader.readLine();
        if(content!=null)
            return (i++)+content;
        return super.readLine();
    }

}

//包装模式包装的是对象(本身就是一个包装类,此时可以简化写法)
在super()完以前的继承类后,就改写要加强的方法就OK

3、脏话过滤器

首先要有一个脏话数据库 在filter--->DirtyWordsFilter--->过滤路径:全部

在doFilter

{
    String woeds[]={"叫兽","禽兽","FUCK"};
    调包
    形成过滤器链
    目的:改写方法

}

4、html过滤器

写Html过滤器filter-->HtmlFilter
在tomcat里的example里找一个Html的filter去复制里面的代码
替换-->令标签代码无效

以下的所有示例都是换包再发送出去,这就是包装设计模式

项目:day1903advanceExample-->CharacterEncodingFilter

项目架构:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name></display-name>
  <servlet>
    <servlet-name>UserRegistServlet</servlet-name>
    <servlet-class>com.itheima.servlet.UserRegistServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>GzipDemo1</servlet-name>
    <servlet-class>com.itheima.servlet.GzipDemo1</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>GzipDemo2</servlet-name>
    <servlet-class>com.itheima.servlet.GzipDemo2</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>UserRegistServlet</servlet-name>
    <url-pattern>/servlet/UserRegistServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>GzipDemo1</servlet-name>
    <url-pattern>/servlet/GzipDemo1</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>GzipDemo2</servlet-name>
    <url-pattern>/servlet/GzipDemo2</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <display-name>CharacterEncodingFilter</display-name>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.itheima.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encode</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>DirtyWordsFilter</display-name>
    <filter-name>DirtyWordsFilter</filter-name>
    <filter-class>com.itheima.filter.DirtyWordsFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>DirtyWordsFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>HtmlFilter</display-name>
    <filter-name>HtmlFilter</filter-name>
    <filter-class>com.itheima.filter.HtmlFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HtmlFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>GzipFilter</display-name>
    <filter-name>GzipFilter</filter-name>
    <filter-class>com.itheima.filter.GzipFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>GzipFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

CharacterEncodingFilter.java

package com.itheima.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

public class CharacterEncodingFilter implements Filter {

    private FilterConfig config;
    public CharacterEncodingFilter() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        String encode = "UTF-8";
        String paramValue = config.getInitParameter("encode");
        if(paramValue!=null){
            encode =paramValue;
        }
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        request.setCharacterEncoding(encode);//post提交有效
        response.setCharacterEncoding(encode);//响应结果的编码
        response.setContentType("text/html;charset="+encode);//告诉浏览器用什么编码,它也有上一行代码的功能

        //调包
        MyHttpServletRequest myrequest = new MyHttpServletRequest(request);
        chain.doFilter(myrequest, response);

    }

    public void init(FilterConfig fConfig) throws ServletException {
        this.config = fConfig;
    }

    //包装设计模式
    public class MyHttpServletRequest extends HttpServletRequestWrapper {

        public MyHttpServletRequest(HttpServletRequest request) {
            super(request);
        }

        @Override
        public String getParameter(String name) {
            String value = super.getParameter(name);
            String method = super.getMethod();//得到请求的类型  get/post
            if("get".equalsIgnoreCase(method)){
                try {
                    value = new String(value.getBytes("iso-8859-1"),super.getCharacterEncoding());
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return value;
        }

    }

}

DirtyWordsFilter.java

package com.itheima.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
public class DirtyWordsFilter implements Filter {

    public DirtyWordsFilter() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        //调包,这样下一层在用时,就会使用重写之后的getParameter()方法
        MyHttpServletRequestDirtyWords mydirtywordsrequest= new MyHttpServletRequestDirtyWords(request);

        chain.doFilter(mydirtywordsrequest, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

    public class MyHttpServletRequestDirtyWords extends HttpServletRequestWrapper{

        public MyHttpServletRequestDirtyWords(HttpServletRequest request) {
            super(request);
        }

        @Override
        public String getParameter(String name) {
            String words []= {"叫兽","禽兽","FUCK"};
            String oldParam = super.getParameter(name);
            if(oldParam!=null)
                for(String word:words){
                    oldParam =oldParam.replace(word, "***");//只替换脏话
                }
            return oldParam;
        }

    }

}

HtmlFilter.java

package com.itheima.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class HtmlFilter
 */
public class HtmlFilter implements Filter {

    /**
     * Default constructor.
     */
    public HtmlFilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //<   &lt;    > &gt;

        MyHttpServletHtmlRequest htmlRequest = new MyHttpServletHtmlRequest(request);
        chain.doFilter(htmlRequest, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

    public class MyHttpServletHtmlRequest extends HttpServletRequestWrapper {

        public MyHttpServletHtmlRequest(HttpServletRequest request) {
            super(request);
        }

        @Override
        public String getParameter(String name) {
            String value =  super.getParameter(name);
            return filter(value);
        }

         public  String filter(String message) {

                if (message == null)
                    return (null);

                char content[] = new char[message.length()];
                message.getChars(0, message.length(), content, 0);
                StringBuffer result = new StringBuffer(content.length + 50);
                for (int i = 0; i < content.length; i++) {
                    switch (content[i]) {
                    case ‘<‘:
                        result.append("&lt;");
                        break;
                    case ‘>‘:
                        result.append("&gt;");
                        break;
                    case ‘&‘:
                        result.append("&amp;");
                        break;
                    case ‘"‘:
                        result.append("&quot;");
                        break;
                    default:
                        result.append(content[i]);
                    }
                }
                return (result.toString());

            }

    }

}

UserRegistServlet.java

package com.itheima.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserRegistServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String name = request.getParameter("name");
        //name = new String(name.getBytes("iso-8859-1"),"UTF-8");
        System.out.println(name);
        response.getWriter().write(name);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);

    }

}

addCustomer.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>客户注册</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/styles.css">
    -->

  </head>

  <body>
    <form action="${pageContext.request.contextPath}/servlet/CustomerRegistServlet" method="post">
        <input name="name"/><input type="submit" value="保存"/>
    </form>
  </body>
</html>

addUser.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>用户注册</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/styles.css">
    -->

  </head>

  <body>
    <form action="${pageContext.request.contextPath}/servlet/UserRegistServlet" method="post">
        <input name="name"/><input type="submit" value="保存"/>
    </form>
  </body>
</html>

总结:

CharacterEncodingFilter.java

DirtyWordsFilter.java

HtmlFilter.java

都是使用了包装设计模式:在filter里使用了自定义的内部类,利用子父类的关系把request发给继承了子类的自定义类去进行包装增强功能,并返回一个实现了自己新的功能方法的返回给新的自定义类,最后放行的时候就返回新的包装后的对象。提供给servlet去使用。

资料下载

时间: 2024-10-13 12:35:19

JavaWeb-19 (JDBC之过滤器Filter)的相关文章

【JavaWeb学习】过滤器Filter

一.简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技

JavaWeb学习篇之----Servlet过滤器Filter和监听器

JavaWeb学习篇之----Servlet过滤器Filter和监听器 首先来看一下Servlet的过滤器内容: 一.Servlet过滤器的概念: *************************************************************************************** Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不产生请求和响应对象,

深入分析JavaWeb Item36 -- 过滤器Filter高级应用

在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的方法. 使用Decorator设计模式对方法进行增强. 使用代理 在阎宏博士的<JAVA与模式>一书中

JavaWeb过滤器Filter

Filter也称为过滤器,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制,页面的同一编码,过滤敏感词汇.压缩响应信息等一些高级功能! Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技术,开发人员可以实现用户在访问某个目标资

javaweb-Servlet过滤器Filter

一.在javaweb学习中javaweb过滤器是一个非常重要的学习内容在web开发阶段的中Javaweb过滤器可以很好的优化代码,同时减少许多不必要的代码,将代码很好的集合在一起,这样的操作可以减少许多不必要的代码,同时大大的减少程序的运行. 二.正对于javaweb的过滤器Filter可以从以下几个方面进行讲解 1.Javaweb的概念 javaweb是一个服务器组键,他可以截取用户端的请求以及响应的信息,并且对信息进行过滤. 2.过滤器的api  Servlet过滤器API包含了3个接口,它

JavaWeb--Servlet过滤器Filter和SpringMVC的HandlerInterceptor(Session和Cookie登录认证)

拦截一些请求进行处理,比如通过它来进行权限验证,或者是来判断用户是否登陆,日志记录,编码,或者限制时间点访问等等,是非常有必要的.所以就有了此篇文章啦. 文章结构:(1)Servlet过滤器Filter:(2)SpringMVC的HandlerInterceptor:(3)对比认知. 一.Servlet过滤器Filter: 此部分是从赵四大佬那里学来的,并补充自己的认知 (1)概念: 能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不产生请求和响应对象,它只能

Servlet过滤器--Filter

一.定义: 是一种特殊的Servlet,可以用来对请求进行过滤,多个过滤器可以形成过滤链: 当请求发送到servlet之前,可以用过滤器截获和处理请求,在servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应. 实现javax.servlet.Filter接口里面的 init,doFilter.destroy等抽象方法,是过滤器的生命周期. 过滤器的工作原理: 二.Web.xml中的配置声明 根据servlet2.3规范,filter执行是按照 filter-mapping 先后

web 过滤器 Filter、 Spring 拦截器 interceptor

1.过滤器(Filter)(在web.xml中注册过滤器) 首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下面一段设置字符编码,不然会导致乱码问题: <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-

过滤器Filter

什么是过滤器 过滤器Filter其实就是Servlet,只不过它的职责是在过滤信息,在请求进入核心servlet时候的过滤,在响应发送给客户端时候的过滤. 使用过滤器 要想创建自己的Filter,只需要实现Filter接口,重写里面的init方法.doFilter方法.destroy方法.init方法在你进行过滤的时候的初始化方法,doFilter方法就是你的核心过滤方法,里面有两个参数,一个是ServletRequest,另外一个是ServletResponse,前面一个代表的是请求,后面一个