webapi使用过滤器拦截客户端传来的参数

项目是前端和后端分离的,想在服务器上拦截客户端传上来的参数,然后做进一步处理,如:权限,验证是否登录,或者其他的

1.添加新类:OperationAttribute,用来做权限验证的

代码如下:

 /// <summary>
    /// 判断是否有权限访问某操作
    /// </summary>
    public class OperationAttribute:ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var parmethod = actionContext.Request.Method;
            string method = parmethod.Method;
            dynamic model = CommonTools.SessionHelper.GetSession("UserInfo");
            int UserId = model.UserId;
            int IsSuper = model.IsSuper;
            string ActionLogo = "";
            if (method.ToLower() == "post")//post提交的时候
            {
                //post提交的参数
                var task = actionContext.Request.Content.ReadAsStreamAsync();
                var content = string.Empty;
                using (Stream sm = task.Result)
                {
                    sm.Seek(0, SeekOrigin.Begin);//设置流的开始位置
                    var bytes = sm.ToByteArray();
                    content = bytes.ToStr();//此处就是客户端出来的参数
                }
                dynamic obj = CommonTools.JsonHelper.DeserializeJsonToObject<dynamic>(content);//序列化为对象
                ActionLogo = obj.ActionLogo == null ? "" : obj.ActionLogo;//获取前端传过来的动作标识
            }
            else
            {
                //get提交获取参数
                var qs = HttpUtility.ParseQueryString(actionContext.Request.RequestUri.Query);
                if (qs.Count > 0)
                {
                    string[] keys = qs.AllKeys;
                    if (keys.Contains("ActionLogo"))
                    {
                        ActionLogo = qs["ActionLogo"];
                    }
                }
            }
            IsVisit(UserId, IsSuper, ActionLogo, actionContext);//开始验证
        }

        public void IsVisit(int UserId, int IsSuper, string ActionLogo, HttpActionContext actionContext)
        {
            if (IsSuper == 1)//超级管理员不需要验证
            {
                base.OnActionExecuting(actionContext);
            }
            else
            {
                if (ActionLogo =="")
                {
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.InternalServerError, new
                    {
                        code = "1",
                        data = "",
                        message = "您无权限进行此操作"
                    });
                }
                else
                {
                    //进行下一步判断
                }
            }
        }
    }

2.添加一个公共类,用来处理post参数

public static class Common 
    {
        /// <summary>
        /// 转为byte数组
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static byte[] ToByteArray(this Stream stream)
        {
            byte[] bytes = new byte[stream.Length];
            stream.Read(bytes, 0, bytes.Length);
            // 设置当前流的位置为流的开始 
            stream.Seek(0, SeekOrigin.Begin);
            return bytes;
        }

        /// <summary>
        /// 转为字符串
        /// </summary>
        /// <param name="arr"></param>
        /// <returns></returns>
        public static string ToStr(this byte[] arr)
        {
            return Encoding.Default.GetString(arr);
        }
        
    }

之所以要这样写,是为了防止过滤器重叠的时候,post提交获取不到参数。

写好过滤类之后,直接在方法,或者控制器上使用,

[Operation]加在方法上,就可以验证方法的权限,加在控制器上,就可以验证控制器下所有的方法,若在控制中有不需要验证的方法,可以在OnActionExecuting上加上:

if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
{
return;
},

然后在不需要验证的方法上调用[AllowAnonymous],

如登录方法:

 [AllowAnonymous]
        [HttpGet]
        public HttpResponseMessage Login(string UserName, string UserPwd)
        {
            string jsonresult = "";
            List<object> OperationResult = db.Login(UserName, UserPwd);
            switch (OperationResult[0].ToString())
            {
                case "0":
                    jsonresult = "{\"State\":0,\"err\":\"10001\",\"info\":\"登录出错\"}";
                    break;
                case "-1":
                    jsonresult = "{\"State\":0,\"err\":\"10002\",\"info\":\"密码错误\"}";
                    break;
                case "-2":
                    jsonresult = "{\"State\":0,\"err\":\"10003\",\"info\":\"用户名不存在\"}";
                    break;
                default:
                    User model = (User)OperationResult[1];
                    CommonTools.SessionHelper.SetSession("UserInfo",model);
                    jsonresult = "{\"State\":1,\"err\":\"10000\",\"info\":\"登录成功\",\"LoginInfo\":{\"UserInfo\":{\"UserName\":\"" + model.UserName + "\",\"UserId\":" + model.UserId + "}";
                    string jsonstr = OperationResult[2].ToString();
                    jsonresult += ",\"MenuInfo\":" + jsonstr;
                    jsonresult += "}}";
                    break;
            }
            HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(jsonresult, Encoding.GetEncoding("UTF-8"), "application/json") };
            return result;
        }

这样登录的方法就绕过了验证

转载于:https://www.cnblogs.com/PiaoYu/p/11386295.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过实现 Filter 接口来创建一个过滤器,然后在 Spring Boot 中使用 @Bean 注解将其注册到应用程序中。在过滤器中,可以通过 HttpServletRequest 对象获取请求头中的 token,然后进行验证或者其他操作。具体实现可以参考 Spring Boot 官方文档或者相关教程。 ### 回答2: 在使用Spring Boot中,可以通过创建一个过滤器拦截token。下面是一个简单的示例,说明如何实现。 首先,需要创建一个自定义的过滤器类,实现javax.servlet.Filter接口。在实现过滤器时,我们可以在doFilter方法中进行token验证的逻辑处理。以下是示例代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class TokenFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 将请求和响应对象转换成HttpServletRequest和HttpServletResponse对象 HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 从请求头中获取token String token = httpRequest.getHeader("Authorization"); // 进行token验证的逻辑处理,例如验证token是否过期、是否有效等 // ... // 如果验证通过,将请求继续传递给下一个过滤器或目标资源处理 chain.doFilter(request, response); } // 其他方法,例如init和destroy方法,可以留空不做处理 } ``` 接下来,需要将自定义的过滤器添加到Spring Boot应用程序中。可以使用@Configuration注解将过滤器添加为一个Bean,并使用@Order注解指定过滤器的执行顺序。例如: ```java import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<TokenFilter> tokenFilter() { FilterRegistrationBean<TokenFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new TokenFilter()); // 设置过滤器的URL映射规则,例如/*表示拦截所有请求 registrationBean.addUrlPatterns("/*"); // 设置过滤器的执行顺序 registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; } } ``` 最后,重新启动Spring Boot应用程序,自定义的过滤器就会拦截所有请求,并对token进行验证处理。 请注意,上述示例只是一个简单的演示,实际应用中可能需要根据具体的需求进行修改和扩展。例如,可以从数据库或缓存中获取token,进行更加复杂的验证逻辑,并在验证失败时返回相应的错误信息。 ### 回答3: 使用Spring Boot实现过滤器拦截Token的步骤如下: 1. 创建一个自定义的过滤器类,实现javax.servlet.Filter接口,并重写doFilter方法。在doFilter方法中,可以通过HttpServletRequest对象获取请求头中的Token信息,并进行相应的验证或处理。 2. 在Spring Boot应用的启动类中,通过添加注解@EnableWebSecurity开启Web安全配置,并通过继承WebSecurityConfigurerAdapter类重写configure方法。 3. 在configure方法中,使用http对象的addFilterBefore方法将自定义的过滤器添加到过滤器链中,指定过滤器在哪个过滤器之前进行拦截。 4. 在过滤器中,可以进行Token的验证和处理逻辑。例如,可以使用JWT来生成和验证Token,或将Token存储在Redis中,根据请求的Token进行校验等。 5. 如果Token验证不通过,可以返回相应的错误信息或重定向到登录页面。如果验证通过,可以进行其他的业务逻辑处理。 总之,通过自定义过滤器并将其添加到Spring Boot的过滤器链中,可以在请求到达Controller之前进行Token的验证和拦截操作,以实现对请求的安全控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值