基于服务器端保存用户的查询参数

最近公司项目有一个新的需求, 希望用户在PC查询的参数能够同步更新到APP端, 避免让用户在PC和APP端重复输入查询条件, 基于项目是前后端分离, APP和PC的请求参数都是一样的且都是POST请求, 因此考虑采用拦截器的方式拦截获取POST请求中的请求体, 同时前端请求后台时, 统一在Header中加入当前页面名称(pageName)的参数, 以用户Sessioin中的工号和pageName作为key, 将请求参数保存到Mongodb中, 基本的方案就是这样, 下面是具体实现

自定义线程池

/*** 线程池配置** @author Eric on 2019/5/4.* @version 1.0*/
@Configuration
public class ThreadPoolConfig {private static final int PROCESSOR_NUM = Runtime.getRuntime().availableProcessors();private static final int MIN_CORE_SIZE = PROCESSOR_NUM < 8 ? 16 : PROCESSOR_NUM * 2;private static final String DEFAULT_THREAD = "default";@Bean("default")public ThreadPoolTaskExecutor executorService() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setThreadNamePrefix(DEFAULT_THREAD);executor.setCorePoolSize(MIN_CORE_SIZE);executor.setMaxPoolSize(PROCESSOR_NUM * 16);executor.setQueueCapacity(PROCESSOR_NUM * 2);executor.setKeepAliveSeconds(30);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}}

自定义拦截器

HelloService封装了保存到Mongodb或者更新到Mongodb的操作 用户信息是从session中获取, 具体用户信息的实体类可以自定义

/*** 记录本次请求参数的拦截器** @author wang.js on 2019/4/26.* @version 1.0*/
@Component
public class RequestParamInterceptor implements HandlerInterceptor {@Resourceprivate HelloService helloService;@Resource(name = "default")private ThreadPoolTaskExecutor executor;private static final Logger LOGGER = LoggerFactory.getLogger(RequestParamInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) {HttpSession session = httpServletRequest.getSession();if (session != null) {String pageName = httpServletRequest.getHeader("pageName");SystemUser user = (SystemUser) session.getAttribute("user");String body = new RequestWrapper(httpServletRequest).getBody();if (user != null && !StringUtils.isEmpty(pageName) && !StringUtils.isEmpty(body)) {executor.submit(() -> {helloService.saveOrUpdate(new MongoBean(pageName + user.getStaffCode(), body), "test");LOGGER.info("保存成功, key:{}, value:{}", pageName + user.getStaffCode(), body);});}}return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {}}

HellService

HellService只是封装了Mongodb的保存和更新操作, 仅供参考

/*** @author wang.js* @date 2018/10/29* @copyright yougou.com*/
@Service
public class HelloService {@Autowiredprivate MongoBeanDao mongoBeanDao;/*** 保存* @param mongoBean*/public void save(MongoBean mongoBean) {mongoBeanDao.insert(mongoBean, "test");}/*** 查找* @param id*/public MongoBean find(String id, String collectionName) {Query query = new Query(Criteria.where("id").is(id));return mongoBeanDao.findByQuery(query, MongoBean.class, collectionName);}/*** 更新** @param mongoBean* @param collectionName* @return*/public boolean update(MongoBean mongoBean, String collectionName) {Update update = new Update().set("value", mongoBean.getValue());Query query = new Query(Criteria.where("id").is(mongoBean.getId()));mongoBeanDao.updateByQuery(update, query, MongoBean.class, collectionName);return true;}public void saveOrUpdate(MongoBean mongoBean, String collectionName) {MongoBean mongoBean1 = find(mongoBean.getId(), collectionName);if (mongoBean1 == null) {save(mongoBean);} else {update(mongoBean, collectionName);}}
}

自定义HttpServletRequestWrapper

因为HttpServletRequest的输入流只能读取一次, 所以这里使用自定义HttpServletRequestWrapper将body中的信息保存起来, 方便后续多次使用 /** * @author wang.js on 2019/4/26. * @version 1.0 */ public class RequestWrapper extends HttpServletRequestWrapper {

    private final String body;public RequestWrapper(HttpServletRequest request) {super(request);StringBuilder stringBuilder = new StringBuilder();BufferedReader bufferedReader = null;InputStream inputStream = null;try {inputStream = request.getInputStream();if (inputStream != null) {bufferedReader = new BufferedReader(new InputStreamReader(inputStream));char[] charBuffer = new char[128];int bytesRead;while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {stringBuilder.append(charBuffer, 0, bytesRead);}}} catch (IOException ex) {ex.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}body = stringBuilder.toString();}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());return new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() throws IOException {return byteArrayInputStream.read();}};}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream()));}String getBody() {return this.body;}}

注册filter

/*** 过滤器** @author wang.js on 2019/4/26.* @version 1.0*/
@WebFilter(urlPatterns = "/*",filterName = "channelFilter")
public class ChannelFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {ServletRequest requestWrapper = null;if(servletRequest instanceof HttpServletRequest) {requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);}if(requestWrapper == null) {filterChain.doFilter(servletRequest, servletResponse);} else {filterChain.doFilter(requestWrapper, servletResponse);}}@Overridepublic void destroy() {}
}

自定义webMvc的配置

/*** 自定义webMvc的配置** @author Eric on 2018/8/19.* @version 1.0*/
@Configuration
public class MyWebMvcConfig extends WebMvcConfigurerAdapter {@Resourceprivate RequestParamInterceptor requestParamInterceptor;/*** 加入到Spring MVC的拦截器链中** @param registry 拦截器注册*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(requestParamInterceptor);}@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {super.configurePathMatch(configurer);}
}

以上操作就可以把在PC和APP端的请求参数保存到Mongodb中, 之后用户进入相应的页面时, 只需要根据当前页面的pageName来获取该用户上次的请求参数即可

转载于:https://www.cnblogs.com/shanzhai/p/10809204.html

基于服务器端保存用户的查询参数相关推荐

  1. Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数

    16_采用SharedPreferences保存用户偏好设置参数 Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数 2013-03-08 16_采用Shar ...

  2. 实例教程五:采用SharedPreferences保存用户偏好设置参数

    android水管工人游戏源码 http://www.eoeandroid.com/thread-207446-1-1.html Android推箱子小游戏 http://www.eoeandroid ...

  3. Android基础入门教程——6.2 数据存储与访问之——SharedPreferences保存用户偏好参数

    Android基础入门教程--6.2 数据存储与访问之--SharedPreferences保存用户偏好参数 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家介绍的是第二种存储用 ...

  4. python用户名和密码登录函数_基于Python构建用户ID和密码存储查询系统,python,建立,一个,用户名,UserID,Password,的...

    大家好,本篇博客目的是建立存储和查询用户名和密码的python系统,基础好的可跳过中间小干货,源码在末尾,喜欢的留下小赞哦! 系统主要功能 主要功能如下: 创建一个新用户及其密码 修改值定用户的密码 ...

  5. hive left outer join 子查询临时表_基于历史数据的用户访问次数,每天新老用户,日活,周活,月活的hive计算...

    最近有一个需求,统计每天的新老用户,日活,周活,月活. 我们每天的增量数据会加入到hive历史数据表中,包含用户访问网站的一些信息,字段有很多,包括用户唯一标识guid. 当然了日活,周活,月活就是一 ...

  6. hsweb提取页面查询参数_zabbix-基础系列(七)-zabbix用户参数

    Zabbix 用户参数 1.介绍和用法 1.介绍 自定义用户参数,也就是自定义key,有时可能想要运行一个代理检查,而不是 Zabbix 的预定义,就可以编写一个命令来检索需要的数据,并将其包含在代理 ...

  7. python保存模型与参数_基于pytorch的保存和加载模型参数的方法

    当我们花费大量的精力训练完网络,下次预测数据时不想再(有时也不必再)训练一次时,这时候torch.save(),torch.load()就要登场了. 保存和加载模型参数有两种方式: 方式一: torc ...

  8. fastapi 用户指南(路径参数、查询参数、请求体)

    文章目录 1. 第一步 1.1 小结 2. 路径参数 2.1 顺序很重要 2.2 预设值 2.3 包含路径的路径参数 3. 查询参数 3.1 查询参数类型转换 4. 请求体 learn from ht ...

  9. php注册登录描述,基于PHP实现用户登录注册功能的详细教程

    教程前先给大家看看小编的实现成果吧! 图1: 图2: 图3: 教程: 实现这个功能我们需要五个php文件: login.php (登录界面,如图2) 登录 登录页面 用户名: required=&qu ...

最新文章

  1. CentOS安装编译环境
  2. 一次实现可以在某些场合替代菱形继承?
  3. Android Configuration change引发的问题及解决方法
  4. java中的me关键字_java中的volatile关键字
  5. 关于串口接收数据不全的问题
  6. STM32PB2(BOOT1)使用注意
  7. 配置Nginx来支持php
  8. Python 2.x 与Python 3.x的差别总结
  9. 牛客练习赛26 D xor序列 (线性基)
  10. 写出C语言中5种数据类型的名称及其关键字,求C语言中的32个关键字及其意思?...
  11. Apollo进阶课程⑰丨Apollo感知之旅——传感器选择和安装
  12. 是什么造就了伟大的程序员?
  13. TCP/IP原理 (四) IP编址
  14. 不使用服务器控件的ASP.NET
  15. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_06.mybatis的环境搭建
  16. Quartz定时器实现
  17. 四叶草启动linux黑屏,E1-471G,黑苹果10.11,Clover无法进入安装界面,直接黑屏重启...
  18. 全能模拟器retroarch+android,全能模拟器 RetroArch Android
  19. 龙卷风收音机android安卓版,龙卷风收音机
  20. CF 949 D Curfew —— 二分答案

热门文章

  1. 函数计算进行自动化运维专题
  2. 【luogu 3811】【模板】乘法逆元
  3. jQuery之事件绑定
  4. PHP中的foreach循环
  5. 学术论文常用英文句型
  6. Logging with Log4net (二)
  7. 编写一个Windows服务程序,定时从数据库中拿出记录发送邮件
  8. LeetCode_Pascal's Triangle II_杨辉三角形II(Java实现)
  9. 【正一专栏】读《怎样做社会研究》——社会研究的意义
  10. Bind 配置非递归服务器