一.目标
把项目中必须登录才能访问的功能保护起来,如果没有登录就访问则跳转到登录页面。
二.思路
三.执行步骤
1.引入依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.编写配置
spring:
session:
store-type: redis
redis:
host: 192.168.10.100
3.设置那些文件不需要过滤
public class AccessPassResources {
//不需要进行检查的访问路径集合
public static final Set<String> PASS_RESOURCE_SET = new HashSet<>();
static {
PASS_RESOURCE_SET.add("/");
PASS_RESOURCE_SET.add("/auth/member/to/reg/page");
PASS_RESOURCE_SET.add("/auth/member/to/login/page");
PASS_RESOURCE_SET.add("/auth/member/do/login");
PASS_RESOURCE_SET.add("/auth/do/member/regist");
PASS_RESOURCE_SET.add("/auth/member/logout");
PASS_RESOURCE_SET.add("/auth/member/send/short/message.json");
}
// 不需要进行检查的静态资源
public static final Set<String> STATIC_RES_SET = new HashSet<>();
static {
STATIC_RES_SET.add("bootstrap");
STATIC_RES_SET.add("css");
STATIC_RES_SET.add("fonts");
STATIC_RES_SET.add("img");
STATIC_RES_SET.add("jquery");
STATIC_RES_SET.add("layer");
STATIC_RES_SET.add("script");
STATIC_RES_SET.add("ztree");
}
/**
* 传入一个servletPath 用于判断他的第一级目录是否是静态资源
* @param servletPath
* @return true 不需要检查,false 需要检查
*/
public static boolean judgeCurrentServletPathWetherStaticResource(String servletPath) {
if (servletPath == null || servletPath.length() == 0) {
throw new RuntimeException(CrowdConstant.MESSAGE_STRING_INVALIDATE);
}
String[] split = servletPath.split("/");
String firstLevelPath = split[1];
return STATIC_RES_SET.contains(firstLevelPath);
}
}
4.ZuulFilter
使用一个类继承ZuulFilter类
shouldFilter()
shouldFilter():判断那些文件需要进行过滤。false,放行,true需要过滤,进行执行run()
@Override
public boolean shouldFilter() {
// 1.获取RequestContext对象
RequestContext currentContext = RequestContext.getCurrentContext();
// 2.通过requstContext对象获取当前请求对象
HttpServletRequest request = currentContext.getRequest();
// 3.获取ServletPath的值
String servletPath = request.getServletPath();
// 4.根据servletPath判断当前请求是否需要拦截
boolean containsResult = AccessPassResources.PASS_RESOURCE_SET.contains(servletPath);
if(containsResult){
// 5.1如果当前请求是可以直接放行的特定功能请求则返回false,不走run,直接放行
return false;
}
boolean isStaticResource = AccessPassResources.judgeCurrentServletPathWetherStaticResource(servletPath);
if(isStaticResource){
// 5.2如果当前请求是一个静态资源也可以直接放行
return false;
}
return true;
run()
run():shouldFilter中返回true之后就会执行这个方法
@Override
public Object run() throws ZuulException {
// 1.获取当前请求的对象
RequestContext requestContext = RequestContext.getCurrentContext();
// 2.获取Session对象
HttpSession session = requestContext.getRequest().getSession();
// 3.从session对象中获取已经登录的用户
Object loginMember = session.getAttribute(CrowdConstant.ATTR_NAME_LOGIN_MEMBER);
// 4.判断登录的用户是否为空
if(loginMember == null){
// 5.将提示消息放入到Session域中
session.setAttribute(CrowdConstant.ATTR_NAME_MESSAGE,"请登录后在访问!!");
// 6.重定向到登录页面
HttpServletResponse response = requestContext.getResponse();
try {
response.sendRedirect("/auth/member/to/login/page");
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
filterType()
filterType():过滤的类型
@Override
public String filterType() {
// 这里返回pre意思是在目标微服务前去执行
return "pre";
}
filterOrder()
@Override
public int filterOrder() {
return 0;
}
完整代码
@Component
public class CrowdAccessFilter extends ZuulFilter {
@Override
public boolean shouldFilter() {
// 1.获取RequestContext对象
RequestContext currentContext = RequestContext.getCurrentContext();
// 2.通过requstContext对象获取当前请求对象
HttpServletRequest request = currentContext.getRequest();
// 3.获取ServletPath的值
String servletPath = request.getServletPath();
// 4.根据servletPath判断当前请求是否需要拦截
boolean containsResult = AccessPassResources.PASS_RESOURCE_SET.contains(servletPath);
if(containsResult){
// 5.1如果当前请求是可以直接放行的特定功能请求则返回false,不走run,直接放行
return false;
}
boolean isStaticResource = AccessPassResources.judgeCurrentServletPathWetherStaticResource(servletPath);
if(isStaticResource){
// 5.2如果当前请求是一个静态资源也可以直接放行
return false;
}
return true;
}
@Override
public Object run() throws ZuulException {
// 1.获取当前请求的对象
RequestContext requestContext = RequestContext.getCurrentContext();
// 2.获取Session对象
HttpSession session = requestContext.getRequest().getSession();
// 3.从session对象中获取已经登录的用户
Object loginMember = session.getAttribute(CrowdConstant.ATTR_NAME_LOGIN_MEMBER);
// 4.判断登录的用户是否为空
if(loginMember == null){
// 5.将提示消息放入到Session域中
session.setAttribute(CrowdConstant.ATTR_NAME_MESSAGE,"请登录后在访问!!");
// 6.重定向到登录页面
HttpServletResponse response = requestContext.getResponse();
try {
response.sendRedirect("/auth/member/to/login/page");
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
public String filterType() {
// 这里返回pre意思是在目标微服务前去执行
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
}