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

来源:互联网 发布:java代理模式的好处 编辑:程序博客网 时间:2024/05/22 03:37

关于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参数。

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