关于springboot过滤器处理request参数问题

关于springboot过滤器处理request参数问题

      最近接触了springboot这个框架遇到些问题,需要用到过滤器处理session中用户问题,和在请求到Controller之前对参数进行处理,根据笔者之前其他MVC框架的经验,想到了过滤器,在网上查了些资料,springboot的过滤器使用实现HandlerInterceptor接口来处理。大致步骤分为两步,下面进行分步讲解。

      第一创建WebInterceptor过滤器类,该类实现HandlerInterceptor,接口里面有三个方法需要实现代码如下:

      package com.example.demo.interceptor;

import java.lang.reflect.Field;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.RequestWrapper;

import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.DispatcherServletWebRequest;

public class WebInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
    }

    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handle) throws Exception {
        // 在请求处理之前进行调用(Controller方法调用之前)
        System.out.println("在请求处理之前进行调用(Controller方法调用之前)");
        Map<String, String[]> map  = req.getParameterMap();
        int page = Integer.parseInt(map.get("page")[0]);
        int rows = Integer.parseInt(map.get("rows")[0]);
        int pagecount = (page-1)*rows;
        String[] pa= {pagecount+""};
        Field lockedField = map.getClass().getDeclaredField("locked");
        lockedField.setAccessible(true);
        lockedField.setBoolean(map, false);//将lock参数设置为false了,就是可以修改了
        map.put("pagecount", pa);
        lockedField.setBoolean(map, true);
        
        /*WebRequest r= new DispatcherServletWebRequest(req);
        r.getParameterMap()
        ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper(req);  
        requestWrapper.addParameter("pagecount" , pagecount);
        req=requestWrapper;  */
        return true;
    }

}

            preHandle方法对分页参数进行处理,通过查询页数page和每页显示条数rows,算出当前页的起始条数pagecount,笔者的初衷是在过滤器中进行计算,把计算出来的pagecount作为参数添加到request参数Parameter中,期初网上的资料显示ParameterRequestWrapper类继承HttpServletRequestWrapper类重写里面的方法实现,实验了几次到Controller中获取参数时并没有pagecount参数,最后想到了直接对Parameter的map集合进行操作,可操作的时候控制台提示No modifications are allowed to a locked ParameterMap错误,后来在网上查到是map锁locked的问题,最后通过尝试用上面的代码实现了,在Controller中得到了pagecount参数。

            第一次发博,有疏忽的地方请谅解,如果你感觉对你的学习有帮助就一起试试吧!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值