基于服务器端保存用户的查询参数
基于服务器端保存用户的查询参数
最近公司项目有一个新的需求, 希望用户在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
基于服务器端保存用户的查询参数相关推荐
- Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数
16_采用SharedPreferences保存用户偏好设置参数 Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数 2013-03-08 16_采用Shar ...
- 实例教程五:采用SharedPreferences保存用户偏好设置参数
android水管工人游戏源码 http://www.eoeandroid.com/thread-207446-1-1.html Android推箱子小游戏 http://www.eoeandroid ...
- Android基础入门教程——6.2 数据存储与访问之——SharedPreferences保存用户偏好参数
Android基础入门教程--6.2 数据存储与访问之--SharedPreferences保存用户偏好参数 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家介绍的是第二种存储用 ...
- python用户名和密码登录函数_基于Python构建用户ID和密码存储查询系统,python,建立,一个,用户名,UserID,Password,的...
大家好,本篇博客目的是建立存储和查询用户名和密码的python系统,基础好的可跳过中间小干货,源码在末尾,喜欢的留下小赞哦! 系统主要功能 主要功能如下: 创建一个新用户及其密码 修改值定用户的密码 ...
- hive left outer join 子查询临时表_基于历史数据的用户访问次数,每天新老用户,日活,周活,月活的hive计算...
最近有一个需求,统计每天的新老用户,日活,周活,月活. 我们每天的增量数据会加入到hive历史数据表中,包含用户访问网站的一些信息,字段有很多,包括用户唯一标识guid. 当然了日活,周活,月活就是一 ...
- hsweb提取页面查询参数_zabbix-基础系列(七)-zabbix用户参数
Zabbix 用户参数 1.介绍和用法 1.介绍 自定义用户参数,也就是自定义key,有时可能想要运行一个代理检查,而不是 Zabbix 的预定义,就可以编写一个命令来检索需要的数据,并将其包含在代理 ...
- python保存模型与参数_基于pytorch的保存和加载模型参数的方法
当我们花费大量的精力训练完网络,下次预测数据时不想再(有时也不必再)训练一次时,这时候torch.save(),torch.load()就要登场了. 保存和加载模型参数有两种方式: 方式一: torc ...
- fastapi 用户指南(路径参数、查询参数、请求体)
文章目录 1. 第一步 1.1 小结 2. 路径参数 2.1 顺序很重要 2.2 预设值 2.3 包含路径的路径参数 3. 查询参数 3.1 查询参数类型转换 4. 请求体 learn from ht ...
- php注册登录描述,基于PHP实现用户登录注册功能的详细教程
教程前先给大家看看小编的实现成果吧! 图1: 图2: 图3: 教程: 实现这个功能我们需要五个php文件: login.php (登录界面,如图2) 登录 登录页面 用户名: required=&qu ...
最新文章
- CentOS安装编译环境
- 一次实现可以在某些场合替代菱形继承?
- Android Configuration change引发的问题及解决方法
- java中的me关键字_java中的volatile关键字
- 关于串口接收数据不全的问题
- STM32PB2(BOOT1)使用注意
- 配置Nginx来支持php
- Python 2.x 与Python 3.x的差别总结
- 牛客练习赛26 D	xor序列 (线性基)
- 写出C语言中5种数据类型的名称及其关键字,求C语言中的32个关键字及其意思?...
- Apollo进阶课程⑰丨Apollo感知之旅——传感器选择和安装
- 是什么造就了伟大的程序员?
- TCP/IP原理 (四) IP编址
- 不使用服务器控件的ASP.NET
- 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_06.mybatis的环境搭建
- Quartz定时器实现
- 四叶草启动linux黑屏,E1-471G,黑苹果10.11,Clover无法进入安装界面,直接黑屏重启...
- 全能模拟器retroarch+android,全能模拟器 RetroArch Android
- 龙卷风收音机android安卓版,龙卷风收音机
- CF 949 D Curfew —— 二分答案