您的位置:首页 > 数据库 > Redis

基于SpringBoot简单实现SpringAop+Redis+cookie 单点登录 和 用户登录检测

2018-07-17 11:01 1271 查看

一、新建一个Ascept(class )

[code]/**
* 测试: Spring Aop 切面编程
* @author Administrator
*
*/
@Aspect
@EnableAspectJAutoProxy
@Configuration
public class TestWebAspectConfig {
private CookieUtil cookieUtil = new CookieUtil();
//自定义切面规则
@Pointcut("execution(* com.qingsong.controler..*.user*(..))")
/**
第一个*是切点方法的返回值类型、第二个*是controller包下所有的controller、后面是controller里以user开头的所有方法(无论方法里面有没有参数)
**/
public void aspectService(){

}
@Before(value="aspectService()")
public void before()throws ServletException, IOException{
//获取request、response、session
ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
HttpServletResponse response = requestAttributes.getResponse();
boolean ok = CookieUtil.checkCookie(request);
System.out.println(ok);
if (!ok) {
response.sendRedirect("/redis/index");//转发到登录界面
}
System.out.println("before");
}
@AfterReturning(returning="result",pointcut="aspectService()")
public void after(Object result)  {

System.out.println("result="+result);
System.out.println("after");
}
}

上面基本上是实现了用户登录检测功能,原理就是在用户访问的时候过aop,aop检测时需要用到用户请求时的request,这时使用  RequestContextHolder 获取   RequestContextHolder.getRequestAttributes().getRequest();(想要了解RequestContextHolder,建议了解一下SpringMVC架构)

下面是我自己定义的Cookie工具类

[code]/**
* cookie 工具类  功能: 减少重复代码,获取cookie、删除cookie
* @author Administrator
*
*/
public class CookieUtil {
/**
* 返回一个可用的 cookie
* @param request
* @param response
* @return
*/
public static Cookie getCookie(HttpServletRequest request,HttpServletResponse response) {
Cookie cookie = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for(Cookie ck : cookies){
if (ck.getName().equals("JSESSIONID2")) {
cookie = ck;
}
}
}
if (cookie == null) {
HttpSession session = request.getSession();
if (session == null) {
session = request.getSession(true);
}
String id = session.getId();
cookie =new Cookie("JSESSIONID2", id);
}
cookie.setPath("/");
cookie.setMaxAge(3600*1);
cookie.setDomain("niao.com");
cookie.setHttpOnly(true);
return cookie;
}
/**
* 删除cookie
* @param request
* @param response
* @return
*/
public static boolean delCookie(HttpServletRequest request,HttpServletResponse response) {
boolean DELCOOKIEOK = false;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("JSESSIONID2")) { //删除cookie
cookie.setPath("/");
cookie.setMaxAge(0);
cookie.setDomain("niao.com");
cookie.setHttpOnly(true);
response.addCookie(cookie);
//删除redis中 键值对
System.out.println("注销成功");
DELCOOKIEOK = true;
}
}
}else {
DELCOOKIEOK = true;
}
return DELCOOKIEOK;
}
public static boolean checkCookie(HttpServletRequest request){
boolean CHECKCOOKIE = false;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("JSESSIONID2")) { //删除cookie
CHECKCOOKIE = true;
}
}
}
return CHECKCOOKIE;
}
}

我这里没有使用基于 SpringBoot 的 redis 自己写了一个简易的

[code]/**
* 单机部署Redis 在用户登录界面
* @author Administrator
*
*/
public class RedisClientUtil {
/**
*
*/
private static JedisPool pool = null; //并发
private static int REDIS_CLIENT_COUNT = 0;
private static Jedis jedis = null; //单点
static{
jedis = new Jedis("127.0.0.1", 6379);
}
/**
* 设置key值
*/
public static void setRedis(String jsessionId,String value) {
if (jedis != null) {

String a=jedis.set(jsessionId,value );

System.out.println("REDIS_CLIENT_COUNT = "+a);
}
}
/**
* 获取key值
* @param key
* @return
*/
public static String getRedisValue(String key){
String value = null;
if (jedis != null) {
value = jedis.get(key);
}
return value;
}
public static void delRedisValue(String key){
if (jedis != null) {
int a = Integer.parseInt(jedis.del(key).toString());
System.out.println(a);
}
}
}

上面的功能有好多实现方法(shiro、CAS、redis+filter ...),希望这篇对大家有帮助

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐