NutzCN Logo
问答 关于请求上下文的问题
发布于 373天前 作者 wanjunjun 265 次浏览 复制 上一个帖子 下一个帖子
标签:

我想在request的上下文中存一些数据,有没有现成的类可以用的?

9 回复

你是想拿到req对象吧?

不是的,我有些频繁使用的数据,在一个请求的处理过程中会用到,比如客户端ip, 城市编码等,所以想放在req的context中,方便自己取。

自己用ThreadLocal包装了一个工具类,但是请求结束,没有把context的内容清除,会导致数据不准,或者说有请求结束时的回调,让我自己清除也可以。

你是在Processor里面使用ThreadLocal的吧?在同一个类里面做好清理嘛

这是我自己包装的类,主要是基础参数的处理,这里已经把有问题的那一行注释掉了

public class ClientUtils
{
    private static final ClientUtils instance = new ClientUtils();
    private static final ThreadLocal<ClientInfo> clientInfos = new ThreadLocal<ClientInfo>();

    private ClientUtils(){}
    public static ClientUtils me(){
        return instance;
    }

    public ClientInfo getClientInfo(){
//        ClientInfo clientInfo = clientInfos.get();
        //不同的请求,会共用一个thread,导致有些请求参数没有更新,每次从请求取一遍算了
        ClientInfo clientInfo = null;
        if(clientInfo == null){
            clientInfo = new ClientInfo();
            HttpServletRequest request = Mvcs.getActionContext().getRequest();
            if(request != null){
                clientInfo.setIp(request.getParameter("ip"));
                clientInfo.setCityCode(request.getParameter("cityCode"));
                clientInfo.setUa(request.getHeader("user-agent"));
                String lon = request.getParameter("lon");
                String lat = request.getParameter("lat");
                if(StringUtils.isNotBlank(lon) && StringUtils.isNotBlank(lat)){
                    clientInfo.setLon(Double.valueOf(lon));
                    clientInfo.setLat(Double.valueOf(lat));
                }
                if(StringUtils.isBlank(clientInfo.getIp())){
                    clientInfo.setIp(getRemoteHost(request));
                }
            }
            clientInfos.set(clientInfo);
        }
        return clientInfo;
    }
}

哦,我没有用Processor,自己写的工具类

如果框架有一个context,可以往里面放东西 ,后面随便可以取,每次请求都不一样就很方便了

有的,叫ActionContext,通过Mvcs.getActionContext可以拿到

哦,看到了。3q

添加回复
请先登陆
回到顶部