@Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { System.out.println("isAccessAllowed 方法被调用"); //这里先全部拒绝 return false; } /** * 返回结果为true表明登录通过 */ @Override protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { System.out.println("onAccessDenied 方法被调用"); // 所以以后发起请求的时候就需要在Header中放一个Authorization,值就是对应的Token String token = ((HttpServletRequest) servletRequest).getHeader("Authorization"); System.out.println(token); if (StringUtils.isEmpty(token)) { System.out.println("没有携带token;非法访问"); //onLoginFail(servletResponse, "非法访问"); return true; } if (JwtUtils.verify(token)) { // 这里是token验证通过 // 获取tokenid String tokenId = JwtUtils.getTokenId(token); // 通过ApplicationContext来获取 ServletContext context = servletRequest.getServletContext(); ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context); RedisUtil redisUtil = ctx.getBean(RedisUtil.class); // 这里在redis判断token是否过期 if (redisUtil.hasKey(tokenId)) { System.out.println("请求成功,通过"); return true; } else { // 过期重新登录 System.out.println("过期重新登录"); onLoginFail(servletResponse, "过期重新登录"); return false; } } else { // 非法token System.out.println("非法token"); onLoginFail(servletResponse, "非法token"); return true; } // 执行方法中没有抛出异常就表示登录成功 } 这段代码如何设置白名单
时间: 2024-02-14 20:05:10 浏览: 96
Spring MVC打印@RequestBody、@Response日志的方法
5星 · 资源好评率100%
在上述代码中,可以通过在 `isAccessAllowed` 方法中增加对白名单的判断,实现对白名单中的IP地址放行。示例如下:
```java
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String requestURI = httpServletRequest.getRequestURI();
String remoteAddr = httpServletRequest.getRemoteAddr();
// 在白名单中的URI或IP地址放行
if (requestURI.contains("/public/") || whitelist.contains(remoteAddr)) {
return true;
}
return false;
}
```
在这个示例中,我们定义了一个名为 `whitelist` 的列表,其中包含了所有被允许访问的IP地址。在 `isAccessAllowed` 方法中,我们获取到请求的URI和IP地址,并判断它们是否在白名单中。如果是,则返回 `true`,即放行请求;如果不是,则返回 `false`,继续执行后续的验证逻辑。需要注意的是,这里我们假设所有在 `/public/` 目录下的请求都是公共资源,不需要进行验证,因此也放行了这些请求。
需要注意的是,这种放行方式只适用于基于URI或IP地址的白名单验证,如果需要进行更复杂的验证,比如基于请求参数或请求头的验证,就需要在 `onAccessDenied` 方法中进行处理。
阅读全文