前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用过滤器Filter放置参数,减少前端传参示例

使用过滤器Filter放置参数,减少前端传参示例

作者头像
Dream城堡
发布于 2020-11-11 09:50:26
发布于 2020-11-11 09:50:26
46700
代码可运行
举报
文章被收录于专栏:Spring相关Spring相关
运行总次数:0
代码可运行
1.功能背景

​ 我们在项目中有些经常会重复使用的参数,如用户信息相关USER_ID。此时并不希望每次都让前端传输重复的参数给我们,一方面减少重复代码的工作量,另一方面可以有效的保护用户隐私信息,这个时候可以在后台将其处理放入过滤器中,实现获得相关的参数的值。

2.示例代码
①包结构
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
├─.idea
│  ├─codeStyles
│  ├─dictionaries
│  ├─inspectionProfiles
│  └─libraries
├─.mvn
│  └─wrapper
├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─example
│  │  │          └─demo
│  │  │              ├─config
│  │  │              ├─context
│  │  │              ├─controller
│  │  │              ├─entity
│  │  │              └─service
│  │  └─resources
│  └─test
│      └─java
│          └─com
│              └─example
│                  └─demo
└─target
    ├─classes
    │  └─com
    │      └─example
    │          └─demo
    │              ├─config
    │              ├─context
    │              ├─controller
    │              ├─entity
    │              └─service
    ├─generated-sources
    │  └─annotations
    ├─generated-test-sources
    │  └─test-annotations
    └─test-classes
        └─com
            └─example
                └─demo
②POM依赖
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <!-- ################## Lombok  ################## -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.0</version><!--$NO-MVN-MAN-VER$ -->
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
③相关类

User:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 用户信息
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private Long id;
    private  String name;
    private  int age;
    
   public User(Long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
   
    /**
     * 创建时间
     */
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
}

UserService:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 此处可以改为数据层
 * 为方便展示 暂时只做简单模拟
 */
@Service("userService")
public class UserService {

    public User getUserById(Long id) {
        if (id.equals(1L)) {
            return new User(1L, "张三", 18);
        }
        return null;
    }
}

TestController:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@RestController
@RequestMapping
public class TestController {

    @RequestMapping("/")
    public String test(Long user_id, String user_name, Integer user_age) {
        String params = "user_id->" + user_id + " user_name->" + user_name + "  user_age->" + user_age;
        return params;
    }

}

BaseApplicationContext:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 通过上下文获取相关类
 */
@Configuration
public class BaseApplicationContext implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        applicationContext = context;
    }

    /**
     * 获取applicationContext对象
     *
     * @return applicationContext对象
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 根据bean的id来查找对象
     *
     * @param id beanId
     * @return 根据id查找到的对象
     */
    public static <T> T getBeanById(String id) {
        return (T) applicationContext.getBean(id);
    }

    /**
     * 根据bean的id来查找对象
     *
     * @param id    beanId
     * @param clazz 类型
     * @return 根据id查找到的对象
     */
    public static <T> T getBeanById(String id, Class<T> clazz) {
        return applicationContext.getBean(id, clazz);
    }

    /**
     * 根据bean的class来查找对象
     *
     * @param c class
     * @return bean的class查找到的对象
     */
    public static <T> T getBeanByClass(Class<T> c) {
        return (T) applicationContext.getBean(c);
    }

    /**
     * 根据bean的class来查找所有的对象(包括子类)
     *
     * @param c
     * @return
     */
    public static Map getBeansByClass(Class c) {
        return applicationContext.getBeansOfType(c);
    }

    public static String getMessage(String key) {
        return applicationContext.getMessage(key, null, Locale.getDefault());
    }
}

RequestWrapper:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * HttpServletRequest的包装类
 */
public class RequestWrapper extends HttpServletRequestWrapper {

    private Map<String, String[]> userInfoMap = new HashMap<String, String[]>();

    /**
     * 特殊的参数名称列表
     */
    private static final Set<String> SPECIAL_NAME = new HashSet<String>();

    /**
     * 当前操作的用户
     */
    public static final String user_id = "user_id".toLowerCase();
    public static final String user_name = "user_name".toLowerCase();
    public static final String user_age = "user_age".toLowerCase();

    static {
        SPECIAL_NAME.add(user_id.toLowerCase());
        SPECIAL_NAME.add(user_name.toLowerCase());
        SPECIAL_NAME.add(user_age.toLowerCase());
    }

    private final HttpServletResponse response;

    public RequestWrapper(HttpServletRequest request, HttpServletResponse response) {
        super(request);
        this.response = response;
        UserService userService = BaseApplicationContext.getBeanById("userService", UserService.class);
        User user = userService.getUserById(1L);
        userInfoMap.put(user_id, this.toArray(user.getId().toString()));
        userInfoMap.put(user_name, this.toArray(user.getName()));
        userInfoMap.put(user_age, this.toArray(String.valueOf(user.getAge())));
    }


    @Override
    public String getParameter(String name) {
        String[] values = this.getParameterValues(name);
        if (values == null) {
            return null;
        } else {
            return values[0];
        }
    }

    @Override
    public String[] getParameterValues(String name) {// NOPMD
        String lowerCaseName = StringUtils.lowerCase(name);
        if (SPECIAL_NAME.contains(lowerCaseName)) {
            return userInfoMap.get(lowerCaseName);
        } else {
            return super.getParameterValues(name);
        }
    }

    private String[] toArray(String content) {
        if (content == null) {
            return null;
        } else {
            return new String[]{content};
        }
    }

}

UserInfoRequestWrapperFilter:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 请求的相关Filter
 */
@Slf4j
public class UserInfoRequestWrapperFilter implements Filter {


    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        RequestWrapper httpRequestWraper = new RequestWrapper(request, response);
        chain.doFilter(httpRequestWraper, res);
    }


    @Override
    public void destroy() {
        log.info(" UserInfoRequestWrapperFilter destory ");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info(" init UserInfoRequestWrapperFilter ");
    }

}

FilterConfiguration:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 把Filter注册到SpringBoot中
 */
@Configuration
public class FilterConfiguration {

    @Bean
    public FilterRegistrationBean<UserInfoRequestWrapperFilter> grantFilterFilter(){
        FilterRegistrationBean<UserInfoRequestWrapperFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        UserInfoRequestWrapperFilter userInfoRequestWrapperFilter = new UserInfoRequestWrapperFilter();
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico");
        filterRegistrationBean.setFilter(userInfoRequestWrapperFilter);
        filterRegistrationBean.setOrder(2);
        filterRegistrationBean.setEnabled(true);
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setName("userInfoRequestWrapperFilter");
        return filterRegistrationBean;
    }

}
④测试结果
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
user_id->1 user_name->张三  user_age->18
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
联邦学习FATE框架安装搭建 - CentOS8
FATE (Federated AI Technology Enabler) 是微众银行AI部门发起的开源项目,为联邦学习生态系统提供了可靠的安全计算框架。FATE项目使用多方安全计算 (MPC) 以及同态加密 (HE) 技术构建底层安全计算协议,以此支持不同种类的机器学习的安全计算,包括逻辑回归、基于树的算法、深度学习和迁移学习等。
小陈运维
2021/10/13
1.2K0
手把手教你搭建惊艳的博客
相信大多数人都有自己搭建博客网站的想法,本文就手把手一步一步的进行,最终结果类似如下样式:
FlyLolo
2022/09/09
6740
手把手教你搭建惊艳的博客
手把手教你搭建惊艳的博客
相信大多数人都有自己搭建博客网站的想法,本文就手把手一步一步的进行,最终结果类似如下样式:
宜轩
2022/12/26
1.1K0
手把手教你搭建惊艳的博客
CentOS 7.4 安装Zabbix 3.4
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。
拓荒者
2019/03/11
5190
CentOS 7.4 安装Zabbix 3.4
【Zabbix】基于CentOS 7.9系统安装部署Zabbix 5.0LTS版本监控系统(详细教程)
文章目录 〇、参考链接🔗 一、Zabbix简介🔊 二、Zabbix功能特点及架构图🥇 三、Zabbix节点规划🎨 四、Zabbix安装步骤📌 Ⅰ、Zabbix-Server服务端部署🔴 1、基础环境配置 📖 2、安装Zabbix镜像源📔 3、安装 Zabbix 服务器📕 4、安装 SCL 存储库📗 5、安装zabbix 前端包📘 6、安装并配置数据库📙 7、修改zabbix_server.conf配置文件📚 8、修改 zabbix 的 php 配置文件📓 9、启动Zabbix server和agent进程📒
宝耶需努力
2022/12/13
3K0
【Zabbix】基于CentOS 7.9系统安装部署Zabbix 5.0LTS版本监控系统(详细教程)
centos8安装部署ovirt-engine
oVirt-engine既可以以虚机的形式部署在ovirt-node上,也可以部署在一台独立的服务器上(建议)
summerking
2022/11/24
1.4K0
CentOS 7 下 Zabbix 3.2 安装
详细讲解CentOS 7 下 Zabbix 3.2 安装的安装过程,希望对你有所帮助。
菲宇
2022/12/02
2950
CentOS 7 下 Zabbix 3.2 安装
Docker之获取镜像(一)
docker是开源的应用容器引擎,基于主流的开发语言Go语言而开发,它是基于Apache2.0协议开发。docker的好处在于它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化,容器完全是使用沙箱隔离的机制,这样保障了不会对宿主机有任何的破坏。毫不夸张的说,正因为有了docker,也就形成了它很完善的生态体系,也可以让微服务架构级的产品全面落地,形成了“软件即服务”的理念,真正意义上解决了Saas化以及Paas化平台级产品的部署难的困境。程序员都是谦虚的,学习什么,都习惯了向世界问好,学习docker也是如此。在搭建docker环境的基础上,执行如下指令,就会输出“Hello from Docker!”
无涯WuYa
2021/10/13
1.3K0
Install LAMP
由 Linux 提供运行环境,Mysql 提供关系型存储,Apache 提供 Web 服务,PHP 完成应用逻辑
franket
2021/08/11
2.1K0
Zabbix 监控系统搭建2
安装Zabbix软件包 [root@zabbix-server zabbix]# yum install zabbix-server-mysql zabbix-web-mysql Loaded plugins: fastestmirror, refresh-packagekit, security Setting up Install Process Repository base is listed more than once in the configuration Loading mirror s
franket
2022/02/09
4590
Install phpMyAdmin
参考 phpMyAdmin文档 和 How to install Apache, PHP 7.2 and MySQL on CentOS 7.4 (LAMP)
franket
2021/08/11
3K0
CentOS 8 安装MySQL(各版本完美解决方案)
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
猫头虎
2024/04/07
1.5K0
CentOS 8 安装MySQL(各版本完美解决方案)
Zabbix 5.4 在CentOS 8.2上的快速搭建
Zabbix 5.4 启动后总是弹出ZABBIX SERVER IS NOT RENNING: THE INFORMATION DISPLAYED MAY NOT BE CORRECT的原因为SELINUX没有关闭,在前面的配置中我们已经关闭了SELINUX,因为没有重启,所以配置没有生效。
dumpcat
2021/09/15
1.2K0
Zabbix 5.4 在CentOS 8.2上的快速搭建
Linux 常用系统工作命令-reboot、poweroff、wget
今天学习 3 个 Linux 小命令 分别是 reboot、poweroff、wget
hedeqiang
2020/07/22
2.1K0
CentOS7.3 64位,搭建Zabbix3.4
2、如果需要卸载,执行命令:rpm -e 软件名,执行失败的时候可以使用:rpm -e --nodeps 软件名强制卸载,卸载之后再使用 rpm -qa | grep mysql 或者rpm -qa | grep mariadb查看结果。
拓荒者
2019/03/11
7970
CentOS7.3 64位,搭建Zabbix3.4
Zabbix Agent 安装
非常灵活与强大,有很多优秀 特性 ,布署与管理也相对简单,下面分享一下它的基础操作
franket
2022/03/21
1.3K0
CentOS 7.x安装搭建Zabbix3.0环境【亲测】
(1)Install Repository with MySQL database
程裕强
2022/05/06
2480
CentOS 7.x安装搭建Zabbix3.0环境【亲测】
CentOS8 搭建zabbix监控系统
哈喽,有些时间没有更新公众号。今日更新一下。 安装MySQL数据库 # 安装wget [root@cby ~]# dnf install wget -y # 下载MySQL源 [root@cby ~]# wget https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm [root@cby ~]# dnf localinstall mysql80-community-release-el8-1.noarch.rpm -y
小陈运维
2021/10/13
5510
如何将 CentOS 8 转换为 CentOS Stream
CentOS 未来是不会更新数字版本了。CentOS 项目组,未来会变更为Stream版本,也就是俗称的滚动版本,那么如何将数字版本升级为滚动版本呢?
小陈运维
2021/10/13
1.9K0
zabbix上线之路(一)——zabbix安装
zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
江小白
2018/07/03
1.8K1
相关推荐
联邦学习FATE框架安装搭建 - CentOS8
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档