美文网首页
请求和响应的装饰

请求和响应的装饰

作者: 码而优则仕 | 来源:发表于2020-08-31 14:42 被阅读0次

请求和响应的装饰

Servlet API 中有4个包装类,可以用来改变Servlet请求和Servlet响应的行为。这些包装类允许将任何方法都“包装”在ServletRequest和ServletResponse,或其HTTP对等体中(分别为HttpServletRequest和HttpServletResponse)。这些包装类遵循Decorator或Wrapper模式,要使用它们,需要先了解什么是模式。

Decorator模式

即使没有某一个对象的类的源代码,甚至即便这个类是声明为final的,Decorator模式和Wrapper模式都允许装饰或包装(直白地说,就是修改)这个对象(的行为)。

Decorator模式适用于无法使用继承的情况(比如,所指对象的类为final),或者你不想亲自创建对象,而是想从另一个子系统中获取。例如,Servlet容器创建了一个ServletRequest和一个ResponseResponse,并将它们传给Servlet的Service方法。改变ServletRequest和ServletResponse行为的唯一方法似乎将它, 包装在其他对象中。唯一必须满足的条件是,被装饰对象的类要实现一个接口,并且要包装的方法必须从这个接口处继承。

Servlet Wrapper 类

Servlet API 中提供了4个类,他们很少用到,但是功能非常强大,分别是 ServletRequestWrapperHttpServletRequestWrapperServletResponseWrapperHttpServletResponseWrapper

这些包装类使用起来非常方便,这些包装类为被包装的对等方法的每一个方法都提供了默认实现。通过继承这些包装类,只需要覆盖想要修改的方法即可。

范例如下:

package cn.com.yuns.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.*;

/**
 * @author wsq
 * @version AutoCorrectFilter.java  2020/7/31  上午9:13 上午
 */
@WebFilter(filterName = "AutoCorrectFilter", urlPatterns = {"/*"})
public class AutoCorrectFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init AutoCorrectFilter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        AutoCorrectHttpServletRequestWrapper wrapper = new AutoCorrectHttpServletRequestWrapper(httpServletRequest);
        filterChain.doFilter(wrapper, servletResponse);
    }


    @Override
    public void destroy() {
        System.out.println("destroy AutoCorrectFilter");
    }

    /**
     * HttpServletRequest 中用户 Http请求中的参数进行空格处理--重写需要的方法
     */
    class AutoCorrectHttpServletRequestWrapper extends HttpServletRequestWrapper {

        private HttpServletRequest httpServletRequest;

        public AutoCorrectHttpServletRequestWrapper(HttpServletRequest request) {
            super(request);
            httpServletRequest = request;
        }

        @Override
        public String getParameter(String name) {
            return autoCorrect(httpServletRequest.getParameter(name));
        }

        @Override
        public String[] getParameterValues(String name) {
            return autoCorrect(httpServletRequest.getParameterValues(name));
        }

        @Override
        public Map<String, String[]> getParameterMap() {
            final Map<String, String[]> parameterMap = httpServletRequest.getParameterMap();
            Map<String, String[]> newMap = new Map<String, String[]>() {
                @Override
                public int size() {
                    return parameterMap.size();
                }

                @Override
                public boolean isEmpty() {
                    return parameterMap.isEmpty();
                }

                @Override
                public boolean containsKey(Object key) {
                    return parameterMap.containsKey(key);
                }

                @Override
                public boolean containsValue(Object value) {
                    return parameterMap.containsValue(value);
                }

                @Override
                public String[] get(Object key) {
                    return autoCorrect(parameterMap.get(key));
                }

                @Override
                public String[] put(String key, String[] value) {
                    return parameterMap.put(autoCorrect(key), autoCorrect(value));
                }

                @Override
                public String[] remove(Object key) {
                    return parameterMap.remove(key);
                }

                @Override
                public void putAll(Map<? extends String, ? extends String[]> m) {
                    parameterMap.putAll(m);
                }

                @Override
                public void clear() {
                    parameterMap.clear();
                }

                @Override
                public Set<String> keySet() {
                    return parameterMap.keySet();
                }

                @Override
                public Collection<String[]> values() {
                    return autoCorrect(parameterMap.values());
                }

                @Override
                public Set<Entry<String, String[]>> entrySet() {
                    return autoCorrect(parameterMap.entrySet());
                }
            };
            return newMap;

        }
    }

    private String autoCorrect(String value) {
        if (value == null) {
            return null;
        }
        value = value.trim();
        int length = value.length();
        StringBuilder temp = new StringBuilder();
        boolean lastCharWasSpace = false;
        for (int i = 0; i < length; i++) {
            char c = value.charAt(i);
            if (c == ' ') {
                if (!lastCharWasSpace) {
                    temp.append(c);
                }
                lastCharWasSpace = true;
            } else {
                temp.append(c);
                lastCharWasSpace = false;
            }
        }
        return temp.toString();
    }

    private String[] autoCorrect(String[] values) {
        if (values != null) {
            int length = values.length;
            for (int i = 0; i < length; i++) {
                values[i] = autoCorrect(values[i]);
            }
            return values;
        }
        return null;
    }

    private Collection<String[]> autoCorrect(Collection<String[]> valueCollection) {
        Collection<String[]> newCollection = new ArrayList<>();
        for (String[] values : valueCollection) {
            newCollection.add(autoCorrect(values));
        }
        return newCollection;
    }

    private Set<Map.Entry<String, String[]>> autoCorrect(Set<Map.Entry<String, String[]>> entrySet) {
        Set<Map.Entry<String, String[]>> newSet = new HashSet<>();
        for (final Map.Entry<String, String[]> entry : entrySet) {
            Map.Entry<String, String[]> newEntry = new Map.Entry<String, String[]>() {
                @Override
                public String getKey() {
                    return entry.getKey();
                }

                @Override
                public String[] getValue() {
                    return autoCorrect(entry.getValue());
                }

                @Override
                public String[] setValue(String[] value) {
                    return entry.setValue(value);
                }
            };
            newSet.add(newEntry);
        }
        return newSet;
    }
}

JSP页面

<%--
  Created by IntelliJ IDEA.
  User: wsq
  Date: 2020/7/31
  Time: 1:20 下午
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User form</title>
</head>
<body>
<form action="test2.jsp" method="post">
    <table>
        <tr>
            <td>Name:</td>
            <td><input name="name"></td>
        </tr>
        <tr>
            <td>Address:</td>
            <td><input name="address"></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="Login">
            </td>
        </tr>
    </table>
</form>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: wsq
  Date: 2020/7/31
  Time: 1:20 下午
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<html>
<head>
    <title>User form</title>
</head>
<body>
<form action="test2.jsp" method="post">
    <table>
        <tr>
            <td>Name:</td>
            <td>${param.name}
                (length:${fn:length(param.name)})
            </td>
        </tr>
        <tr>
            <td>Address:</td>
            <td>${param.address}
                (length:${fn:length(param.address)})
            </td>
        </tr>
    </table>
</form>
</body>
</html>

相关文章

  • 请求和响应的装饰

    请求和响应的装饰 Servlet API 中有4个包装类,可以用来改变Servlet请求和Servlet响应的行为...

  • cbv加装饰器,中间件,csrf

    1. CBV加装饰器 2. 中间件 中间件是什么?请求和响应之间的一道屏障 中间件作用:控制请求和响应 djang...

  • 从一个例子了解请求和响应中的参数

    HTTP 协议规定了请求和响应的格式和行为,这里通过分析百度首页的请求和响应,来了解请求和响应中的各种参数。浏览器...

  • 请求和响应

    Server(服务端)、Client(客户端) 浏览器发出请求,服务器在80端口接收请求;服务器返回内容(响应),...

  • 请求和响应

    Django REST framework 处理请求和响应有以下几个关键点。 1. 请求对象(Request ob...

  • 请求和响应

    HttpServletRespone对象: 应用: HttpServletRequest对象: 应用: Reque...

  • 请求和响应

    WWW的发明 1989年-1992年, Tim Berners-Lee(李爵士), 发明了WWW(World Wi...

  • 请求和响应

    请求对象(Request objects)拓展了Django自带的HttpRequestRequest对象的核心功...

  • 网络基础与 Node.js Server

    网络基础 网络与 IP 前面说了,请求和响应都是遵循 HTTP 协议的,HTTP 只是规定了请求和响应时那 4 个...

  • HTTP简单认识

    1、HTTP的请求和响应 HTTP的请求和响应都包含4个部分,在命令行输入curl -v www.baidu.co...

网友评论

      本文标题:请求和响应的装饰

      本文链接:https://www.haomeiwen.com/subject/epksrktx.html