部分代码
web层代码:joy_bms(redis、filter登录控制)
https://github.com/bjjoy/joy_bms.git
http对接service层代码:auth项目git地址
https://github.com/bjjoy/service_auth
1.前言
本文给出请求处理层(web)代码,内容包括
(1)引入redis:对象读写,保存登录用户信息
(2)filter:过滤请求,用户未登录或过期完成退出
2.redis安装
(1)搜索下载redis,本文是windows版Redis-x64-3.2.100
(2)搜索下载安装可视化工具RedisDesktopManager
3.新增红框目录
(1)auth.service
- AuthUserService依赖redis包,以sessionId作为key,读取、写入、更新当前用户信息,设置超时1800s。
- CurrentUser当前用户信息
- SessionFilter处理除登录意外请求,未登录要返回提示,主要代码片段如下
@WebFilter(filterName="sessionFilter",urlPatterns="/test/*")
public class SessionFilter implements Filter {
@Autowired
AuthUserService authUserService;
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse)servletResponse;
CurrentUser currentUser = authUserService.getCurrentUser();
if (currentUser != null){
//存在用户刷新redis用户过期时间
authUserService.updateUserTime();
}else {
httpServletResponse.sendRedirect("/user/error");
}
filterChain.doFilter(httpServletRequest,httpServletResponse);
}
@Override
public void destroy() {}
}
注意:采用注解设置filter,要过滤的url格式如:urlPatterns={“/test/“,”/product/“},并且需要在Application文件添加注解@ServletComponentScan,如下
@SpringBootApplication
@EnableCaching
@ServletComponentScan
public class JoyBmsApplication {
(2)redis
- pom.xml引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- RedisConfig和RedisMapService,提供对象的增删改查
(3)web给出测试程序和登录程序
(4)properties文件添加redis设置如下
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=8
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=1
# 连接超时时间(毫秒)
spring.redis.timeout=2000
4.测试样例
(1)运行redis,redis-server.exe
(2)运行可视化工具
(3)打开postman,运行文章顶端joy_bms,auth,运行mysql
- postman执行post请求:
http://localhost:8020/user/auth/login?loginName=test2&password=123456
- 返回结果
{
"traceID": null,
"code": 200,
"msg": "successful",
"data": null
}
- redis内容
(4)获取当前用户
- postman发送请求get
http://localhost:8020/test/getCurrentUser - 返回结果
{
"traceID": null,
"code": 200,
"msg": "successful",
"data": {
"uuid": "e170921d5e4f4d52bde5ffdb6ef08d33",
"loginName": "test2",
"mobile": null,
"loginIp": null,
"loginDate": null
}
}
5.遗留问题
(1)跨域问题,前端项目ajax请求会失败,由于前端项目端口或域名与joy_bms不一致
(2)filter是url级别限制,没有与角色权限绑定,没有完成根据角色对访问的控制
(3)session没有共享,分布式部署时,不同tomcat各自管理session,获取当前登录用户会失败。
6.感悟
(1)感觉稍微有点明了了,通过springboot开发笔记1~4
(2)要解决遗留问题还是挺麻烦的
(3)前端不太熟,希望以后能补上前端内容,完成一个完整的权限管理模块