filter的request增强

BufferedReader的增强

package cn.lcp.damo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;

/*
1.实现与被增强对象相同的接口  BufferedReader
2、定义一个变量记住被增强对象
3、定义一个构造器,接收被增强对象
4、覆盖需要增强的方法
5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法
 */

public class BufferedReaderWrapper extends BufferedReader {

    private BufferedReader br;
    private int linenum = 1;
    public BufferedReaderWrapper(BufferedReader in) {
        super(in);
        this.br = in;
    }
    @Override
    public String readLine() throws IOException {

        String line = br.readLine();
        if(line==null){
            return line;
        }
        return linenum++ + ":" + line;
    }
}
package cn.lcp.damo;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TestBufferedReaderWrapper {

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new FileReader("src/cn/lcp/demo/BufferedReaderWrapper.java"));
        BufferedReaderWrapper wrapper = new BufferedReaderWrapper(br);

        FileWriter fw = new FileWriter("c:\\1.java");

        String line = null;
        while((line=wrapper.readLine())!=null){
            fw.write(line + "\r\n");
        }

        fw.close();
        wrapper.close();
        br.close();
    }

}

为解决全站乱码

package cn.lcp.web.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 CharacterEncodingFilter implements Filter {

    public void destroy() {
        // TODO Auto-generated method stub

    }

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

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

        // 对get提交的数据还是没有办法对其改变编码,所以要对request的getParameter方法缺少功能了。
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //放行的是自己的包装类
        MyCharacterEncodingRequest requestWrapper = new MyCharacterEncodingRequest(
                request);
        chain.doFilter(requestWrapper, response);

    }

    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }
}

/*
 * 1.实现与被增强对象相同的接口 2、定义一个变量记住被增强对象 3、定义一个构造器,接收被增强对象 4、覆盖需要增强的方法
 * 5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法
 */
// 包装类。
class MyCharacterEncodingRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;

    // 接受被增强对象
    public MyCharacterEncodingRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    @Override
    public String getParameter(String name) {

        try {
            // 客户机提交的值
            String value = this.request.getParameter(name);
            if (value == null) {
                return null;
            }
            // 判断客户机的提交方式是不是get。这里忽略了get和GET方式
            if (!this.request.getMethod().equalsIgnoreCase("get")) {
                return value;
            }

            //客户机的原始码表
            value = new String(value.getBytes("ISO8859-1"),
                    this.request.getCharacterEncoding()); //获取上面的request设定的编码
            return value;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
package cn.lcp.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 ServletDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        System.out.println(request.getParameter("username"));

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>day18_4</display-name>

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>cn.lcp.web.filter.CharacterEncodingFilter</filter-class>
    </filter>

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

    <servlet>
        <description>This is the description of my J2EE component
        </description>
        <display-name>This is the display name of my J2EE component
        </display-name>
        <servlet-name>ServletDemo1</servlet-name>
        <servlet-class>cn.lcp.servlet.ServletDemo1</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ServletDemo1</servlet-name>
        <url-pattern>/servlet/ServletDemo1</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>
<%@ 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>My JSP ‘test.jsp‘ starting page</title>
  </head>

  <body>

       <c:url value="/servlet/ServletDemo1" scope="page" var="servletDemo1">
           <c:param name="username" value="吊死扶伤"></c:param>
       </c:url>

       <a href="${servletDemo1 }">点点</a>

       <form action="${pageContext.request.contextPath }/servlet/ServletDemo1" method="post">
           用户名:<input type="text" name="username">
           <input type="submit">
       </form>
  <%
        String param = request.getParameter("param");
    %>
  <a href="URLCharset.jsp?param=‘中文‘">请点击这个链接</a><br>
        你提交的参数为:<%=param%>  

  </body>
</html>

脏话过滤器

package cn.lcp.web.filter;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

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 DirtyFilter implements Filter {

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

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        DirtyRequest dirtyrequest = new DirtyRequest(request);

        chain.doFilter(dirtyrequest, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void destroy() {
    }
}

//记住所有的脏话
class DirtyRequest extends HttpServletRequestWrapper{

    private List<String> dirtyWords = Arrays.asList("傻B","操蛋","畜生");
    private HttpServletRequest request;

    public DirtyRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    @Override
    public String getParameter(String name) {
        //获取数据
        String value = this.request.getParameter(name);
        if(value==null){
            return null;
        }
        //检测是否有脏话
        for(String dirtyWord : dirtyWords){
            if(value.contains(dirtyWord)){
                value = value.replace(dirtyWord, "****");
            }
        }
        return value;
    }
}
package cn.lcp.web.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 CharacterEncodingFilter implements Filter {

    public void destroy() {
        // TODO Auto-generated method stub

    }

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

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

        // 对get提交的数据还是没有办法对其改变编码,所以要对request的getParameter方法缺少功能了。
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //放行的是自己的包装类
        MyCharacterEncodingRequest requestWrapper = new MyCharacterEncodingRequest(
                request);
        chain.doFilter(requestWrapper, response);

    }

    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }
}

/*
 * 1.实现与被增强对象相同的接口 2、定义一个变量记住被增强对象 3、定义一个构造器,接收被增强对象 4、覆盖需要增强的方法
 * 5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法
 */
// 包装类。
class MyCharacterEncodingRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;

    // 接受被增强对象
    public MyCharacterEncodingRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    @Override
    public String getParameter(String name) {

        try {
            // 客户机提交的值
            String value = this.request.getParameter(name);
            if (value == null) {
                return null;
            }
            // 判断客户机的提交方式是不是get。这里忽略了get和GET方式
            if (!this.request.getMethod().equalsIgnoreCase("get")) {
                return value;
            }

            //客户机的原始码表
            value = new String(value.getBytes("ISO8859-1"),
                    this.request.getCharacterEncoding()); //获取上面的request设定的编码
            return value;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
package cn.lcp.web.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 ServletDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String message = request.getParameter("message");   //<script>
        response.getWriter().write("您上次的留言是:<br/>" + message);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}
<?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"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>day18_5</display-name>

    <filter>
        <filter-name>DirtyFilter</filter-name>
        <filter-class>cn.lcp.web.filter.DirtyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>DirtyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <description>This is the description of my J2EE component
        </description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>ServletDemo2</servlet-name>
        <servlet-class>cn.lcp.web.servlet.ServletDemo2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletDemo2</servlet-name>
        <url-pattern>/servlet/ServletDemo2</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>cn.lcp.web.filter.CharacterEncodingFilter</filter-class>
    </filter>

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

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP ‘test2.jsp‘ starting page</title>
  </head>

  <body>

       <form action="${pageContext.request.contextPath }/servlet/ServletDemo2" method="post">
       留言:
       <textarea rows="8" cols="60" name="message"></textarea>
       <input type="submit" value="发表">

       </form>

  </body>
</html>

html转义过滤器

public class HtmlFilter implements Filter {

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

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

        MyHtmlRequest myrequest = new MyHtmlRequest(request);
        chain.doFilter(myrequest, response);

    }

    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }
}

class MyHtmlRequest extends HttpServletRequestWrapper{

    private HttpServletRequest request;

    public MyHtmlRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    @Override
    public String getParameter(String name) {
        //tomcat帮获取值。
        String value = this.request.getParameter(name);
        if(value==null){
            return null;  //检查值是否存在
        }
        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());

        }
}
时间: 2024-07-30 07:27:36

filter的request增强的相关文章

使用HttpServletRequestWrapper在filter修改request参数

处理过程: (1)页面提交请求“/sa?userid=123456789&username=rensanning” (2)通过Filter处理加入新参数“name=newname” (3)sa的Servlet中forward到“/sb?myname=rensanning&mycountry=china” (4)sb的Servlet中生成页面输出所有参数:userid.username.myname.mycountry.name 第一步: 最简单,在页面上先输出一个href为改地址的链接即可

Filter中request对象强转问题

以下为过滤器doFIlter方法的源代码: public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request; HttpServletResponse res = (HttpServletRespons

JSP笔记——8.Filter介绍

跟它的名字一样,filter能够拦截特定的用户请求或者相应,并对这些东西进行处理.虽然很少用,不过也可以对request进行response.filter可以拦截多个请求相应,一个请求响应也可以被多个filter拦截.使用filter只需要创建filter处理类,然后在xml中配置filter. 创建filter类 必须实现Filter接口,里面要有三个方法:init用于初始化filter:destroy用于销毁filter前完成某些资源的回收:doFilter实现过滤功能.因为filter是处

filter的知识点 和 实例

一.过滤器Filter 1.filter的简介 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目    标资源访问前后进行逻辑处理 2.快速入门 步骤: 1)编写一个过滤器的类实现Filter接口 2)实现接口中尚未实现的方法(着重实现doFilter方法) 3)在web.xml中进行配置(主要是配置要对哪些资源进行过滤) public class QuickFilter1  implements Filter{ @Override    //Filter对象销

springMvc filter 获取并打印参数

---恢复内容开始--- 今天领导安排给我一个活,在web.xml添加一个拦截器,日志打印出请求和响应的参数,搞了一下午,现在再次做一个笔记. 先不急着上代码,我们先要理清整个http请求的逻辑, 一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同样有标准的格式.无论是什么客户端或者是什么服务端,大家只要按照HTTP的协议标准来

web容器调用Filter和Servlet顺序学习

web容器调用Filter和Servlet顺序学习   一直对Filter和Servlet在哪里被web容器调用迷惑,后查看tomcat源码,揭开了其面纱.1. 下面是一个简单的时序图: 2. 对上面时序图中用到的主要类进行分析 1)         ApplicationFilterChain类,有两个主要函数,下面是省略过会的代码 public voiddoFilter(request, response) {//暴露在外面的调用接口 if( Globals.IS_SECURITY_ENAB

模拟JavaEE的Filter

做JavaEE开发几年了,只是知道Filter.Servlet的执行流程,但是一直对Filter是如何实现的并不了解. Filter的处理中的FilterChain是J2ee的接口,并没有提供实现,具体的实现有各个Servlet容器来实现的.今天就找了个时间,简单的看了一下Tomcat的FilterChain的内部实现,做了一个大致的了解,下面就来模拟了一下. 以我对Tomcat中Filter简单实现,设计了下面的类图: Filter接口.FilterChain,是完全按照J2EE中的Filte

【Servlet】Java Servet Filter 过滤器

Filter的设计思想Filter是一种AOP的设计思想 : 面向切面 下面这是一个使用filter的登录案例:我们通过一张图片理解理解filer面向切面下面是项目的结构: 下面是jsp文件: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W

软键盘实例 request参数修改

软键盘实例 request参数修改 这里的键盘 里面的内容是乱序的,每次请求都会不一样的顺序. 键盘内容是一个DIV的背景图,方框是DIV边框.控制按钮直接在前台控制就行. 请求流程如下 JSP请求软键盘图片->action 绘制图片并记录 每个值对应的位置 JSP登录(密码位置)-->Filter把密码转换成真实密码值->登录校验Filter 代码如下 <%@ page isELIgnored="false" %> <%@ page languag