HttpResponse.Filter

博客介绍了在MSDN中获取或设置包装筛选器对象以修改HTTP实体主体的方法。关键是实现筛选器对象,可自定义Stream类,将Filter属性设为该对象,使所有发送的HTTP输出通过筛选器,还提及在aspx页面调用。

MSDN:获取或设置一个包装筛选器对象,该对象用于在传输之前修改 HTTP 实体主体。

这个的关键在于实现筛选器对像,查看Filter接受的类型是Stream。所以可以自定义一个Stream类,当创建 Stream 对象并将 Filter 属性设置为 Stream 对象时,所有发送的 HTTP 输出将通过筛选器。

自定义Stream类
public class ChangeStream : System.IO.Stream
{
    private System.IO.Stream output;
    public ChangeStream(Stream s)
    {
        output = s;
    }
    public override bool CanRead
    {
        get { return output.CanRead; }
    }

    public override bool CanSeek
    {
        get { return output.CanSeek; }
    }

    public override bool CanWrite
    {
        get { return output.CanWrite; }
    }

    public override void Flush()
    {
        output.Flush();
    }

    public override long Length
    {
        get { return output.Length; }
    }

    public override long Position
    {
        get
        {
            return output.Position;
        }
        set
        {
            output.Position = value;
        }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return output.Read(buffer, offset, count);
    }

    public override long Seek(long offset, System.IO.SeekOrigin origin)
    {
        return output.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        output.SetLength(value);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        StringComparison ignore = StringComparison.CurrentCultureIgnoreCase;
        if (HttpContext.Current != null)
        {
            HttpContext context = HttpContext.Current;
            if (context.Response.ContentType.Equals("text/html", ignore))
            {
                Encoding encoding = context.Response.ContentEncoding;
                string html = encoding.GetString(buffer, offset, count)
                    .ToUpper();
                byte[] bytes = encoding.GetBytes(html);
                output.Write(bytes, 0, bytes.Length);
            }
            else
                output.Write(buffer, offset, count);
        }
    }
}

 

在页面上调用:

 Response.Filter = new ChangeStream(Response.Filter);
        Response.Write("gm");

aspx页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    asdfasdf
    </div>
    </form>
</body>
</html>
输出结果:
GM
ASDFASDF
就是这么简单,哈哈。
根据Response.Filter的这个功能可以实现对hmtl页面压缩。
主要代码如下:
 private const string GZIP = "gzip";
        private const string DEFLATE = "deflate";
        private bool IsEncodingAccepted(string encoding)
        {

            return Request.Headers["Accept-encoding"] != null && Request.Headers["Accept-encoding"].Contains(encoding);

        }

        private void SetEncoding(string encoding)
        {
            Response.AppendHeader("Content-encoding", encoding);
        }



使用方式
   if (IsEncodingAccepted(GZIP))
                {
                    Response.Filter = new GZipStream(Response.Filter, CompressionMode.Compress);
                    SetEncoding(GZIP);

                }

                else if (IsEncodingAccepted(DEFLATE))
                {

                    Response.Filter = new DeflateStream(Response.Filter, CompressionMode.Compress);
                    SetEncoding(DEFLATE);
                }

转载于:https://www.cnblogs.com/guolihao/archive/2013/03/13/2957659.html

@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { RequestWrapper requestWrapper = null; try { HttpServletRequest req = (HttpServletRequest) request; request.setCharacterEncoding("UTF-8"); String client = req.getHeader("client"); if (!"OPTIONS".equals(req.getMethod())){ HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Access-Control-Allow-Origin", "*"); httpResponse.setContentType("application/json;charset=UTF-8"); httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); httpResponse.setHeader("Access-Control-Max-Age", "3600"); httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token,token,id,param,clientId,hztoken"); // 如果要把Cookie发到服务器,需要指定Access-Control-Allow-Credentials字段为true httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpResponse.setHeader("Access-Control-Expose-Headers", "*"); //过滤排除uri for (String uri : excludeUrls) { if (req.getRequestURI().equals(uri) || req.getRequestURI().contains(uri)) { chain.doFilter(request, httpResponse); return; } } requestWrapper = new RequestWrapper(req); String token = String.valueOf(req.getHeader("token")); // 处理post请求 if ("POST".equals(req.getMethod())) { StringBuilder str = new StringBuilder(); String line; BufferedReader reader; reader = requestWrapper.getReader(); while ((line = reader.readLine()) != null) {
07-19
public class JWTFilter extends AuthenticatingFilter { @Override protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception { //获取请求token String token = getRequestToken((HttpServletRequest) request); if(StringUtils.isBlank(token)){ return null; } return new JWTToken(token); } @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { if(((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())){ return true; } return false; } @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { //获取请求token,如果token不存在,直接返回401 String token = getRequestToken((HttpServletRequest) request); if(StringUtils.isBlank(token)){ HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin()); String json = new Gson().toJson(R.error(HttpStatus.SC_UNAUTHORIZED, "invalid token")); httpResponse.getWriter().print(json); return false; } return executeLogin(request, response); } @Override protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setContentType("application/json;charset=utf-8"); httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin()); try { //处理登录失败的异常 Throwable throwable = e.getCause() == null ? e : e.getCause(); R r = R.error(HttpStatus.SC_UNAUTHORIZED, throwable.getMessage()); String json = new Gson().toJson(r); httpResponse.getWriter().print(json); } catch (IOException e1) { } return false; } 完整方法
10-30
/** * Copyright (c) 2016-2019 人人开源 All rights reserved. * * https://www.renren.io * * 版权所有,侵权必究! */ package io.renren.modules.sys.jwt; import com.google.gson.Gson; import io.renren.common.utils.HttpContextUtils; import io.renren.common.utils.R; import org.apache.commons.lang.StringUtils; import org.apache.http.HttpStatus; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.web.filter.authc.AuthenticatingFilter; import org.springframework.web.bind.annotation.RequestMethod; import jakarta.servlet.Filter; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** * jwt token过滤器 * * @author Mark sunlightcs@gmail.com */ public class JWTFilter extends AuthenticatingFilter { @Override protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception { //获取请求token String token = getRequestToken((HttpServletRequest) request); if(StringUtils.isBlank(token)){ return null; } return new JWTToken(token); } @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { if(((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())){ return true; } return false; } @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { //获取请求token,如果token不存在,直接返回401 String token = getRequestToken((HttpServletRequest) request); if(StringUtils.isBlank(token)){ HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin()); String json = new Gson().toJson(R.error(HttpStatus.SC_UNAUTHORIZED, "invalid token")); httpResponse.getWriter().print(json); return false; } return executeLogin(request, response); } @Override protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setContentType("application/json;charset=utf-8"); httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin()); try { //处理登录失败的异常 Throwable throwable = e.getCause() == null ? e : e.getCause(); R r = R.error(HttpStatus.SC_UNAUTHORIZED, throwable.getMessage()); String json = new Gson().toJson(r); httpResponse.getWriter().print(json); } catch (IOException e1) { } return false; } /** * 获取请求的token */ private String getRequestToken(HttpServletRequest httpRequest){ //从header中获取token String token = httpRequest.getHeader("token"); //如果header中不存在token,则从参数中获取token if(StringUtils.isBlank(token)){ token = httpRequest.getParameter("token"); } return token; } }
10-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值