springmvc 通过aop方式进行登录控制

springmvc 通过aop方式进行登录控制

登录控制,大体上的流程就是登陆的时候,在HttpSession中存放本次登录的用户名和密码。然后在进行每次页面跳转和后台请求的时候需要判断Session中是否有这个用户名和密码,如果有,说明用户在本浏览器上登录过,能够进行继续的操作,后台能够返回数据,支持页面跳转。如果没有登录,那么直接跳转到登录页面。
一开始,想使用filter或者listener进行控制一下,如果session中没有直接跳转到登录页面,齐活儿。但是,想来想去,这样做有点low了。因为后期肯定要加入权限控制,一旦加入权限控制,再和这个登录控制结合起来,业务层的代码不知道会乱成什么样子了。所以,最后决定使用aop。
这里使用的是spring aop。具体的步骤如下:
1、springmvc的controller层不能直接的进行Around切面操作,需要使用cglib做代理,然后才能加入切面。
2、在切面中判断Session中是否有username和password。如果有继续进行访问,如果没有,返回未登录的提示信息,或者直接跳转到登录界面。
3、在切面中需要利用HttpSession,可以参考springmvc 得到HttpServletRequest、HttpServletResponse、HttpSession
好,下面上货:
1、annotation
[java]  view plain  copy
  1. package com.xueyou.ssm.annotation;  
  2.   
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. /** 
  9.  * Created by wuxueyou on 16/10/2. 
  10.  */  
  11. @Retention(RetentionPolicy.RUNTIME)  
  12. @Target({ElementType.METHOD,ElementType.TYPE})  
  13. public @interface ControllerAnnotationLogin {  
  14.     String name() default "";  
  15.   
  16. }  

2、controller
[html]  view plain  copy
  1. package com.xueyou.ssm.controller;  
  2.   
  3. import com.xueyou.ssm.service.LoginService;  
  4. import org.springframework.beans.factory.annotation.Autowired;  
  5. import org.springframework.web.bind.annotation.RequestMapping;  
  6. import org.springframework.web.bind.annotation.RequestMethod;  
  7. import org.springframework.web.bind.annotation.RestController;  
  8.   
  9. import java.util.HashMap;  
  10. import java.util.Map;  
  11.   
  12. /**  
  13.  * Created by wuxueyou on 16/10/1.  
  14.  */  
  15. @RestController  
  16. @RequestMapping(value = "/login" , method = {RequestMethod.GET,RequestMethod.POST}, produces = "application/json;charset=UTF-8;")  
  17. public class LoginController {  
  18.     @Autowired  
  19.     private LoginService loginService;  
  20.   
  21.     @RequestMapping(value = "/ssmlogin")  
  22.     public Map<String,Object> ssmLogin(String username,String password){  
  23.         Map<String,Object> params = new HashMap<>();  
  24.         System.out.println(username);  
  25.         System.out.println(password);  
  26.         params.put("username",username);  
  27.         params.put("password",password);  
  28.         return loginService.login(params);  
  29.     }  
  30. }  

[html]  view plain  copy
  1. package com.xueyou.ssm.controller;  
  2.   
  3. import com.xueyou.ssm.annotation.ControllerAnnotationLogin;  
  4. import org.springframework.stereotype.Controller;  
  5. import org.springframework.web.bind.annotation.RequestMapping;  
  6. import org.springframework.web.bind.annotation.RequestMethod;  
  7.   
  8. /**  
  9.  * Created by wuxueyou on 16/10/1.  
  10.  */  
  11. @Controller  
  12. @RequestMapping(value = "/web"method = {RequestMethod.GET, RequestMethod.POST})  
  13. public class UrlPageController {  
  14.     @RequestMapping(value = "/login")  
  15.     public String login() {  
  16.         return "login";  
  17.     }  
  18.   
  19.     @ControllerAnnotationLogin  
  20.     @RequestMapping(value = "/main")  
  21.     public String main() {  
  22.         return "main";  
  23.     }  
  24. }  

3、loginServiceImpl
[java]  view plain  copy
  1. package com.xueyou.ssm.serviceimpl;  
  2.   
  3. import com.xueyou.ssm.dao.LoginDao;  
  4. import com.xueyou.ssm.service.LoginService;  
  5. import com.xueyou.ssm.utils.Base;  
  6. import com.xueyou.ssm.utils.SysContent;  
  7. import org.springframework.beans.factory.annotation.Autowired;  
  8. import org.springframework.stereotype.Service;  
  9.   
  10. import javax.servlet.http.HttpSession;  
  11. import java.util.HashMap;  
  12. import java.util.List;  
  13. import java.util.Map;  
  14.   
  15. /** 
  16.  * Created by wuxueyou on 16/10/1. 
  17.  */  
  18. @Service("LoginService")  
  19. public class LoginServiceimpl implements LoginService{  
  20.     @Autowired  
  21.     LoginDao loginDao;  
  22.   
  23.     @Override  
  24.     public Map<String, Object> login(Map<String, Object> params) {  
  25.         Map<String,Object> resMap = new HashMap<>();  
  26.         List<Map<String,Object>> tempUserList = loginDao.login(params);  
  27.         if(tempUserList.size() == 0){  
  28.             resMap.put("resCode", Base.MSG_CODE_ERROR);  
  29.             resMap.put("resMsg",Base.MSG_USERNAMEORPASSWORDWRONG);  
  30.         }else {  
  31.             HttpSession session = SysContent.getSession();  
  32.             session.setAttribute("username",params.get("username").toString());  
  33.             session.setAttribute("password",params.get("password").toString());  
  34.             resMap.put("resCode",Base.MSG_CODE_SUCCESS);  
  35.             resMap.put("resMsg",Base.MSG_SUCCESS);  
  36.         }  
  37.         return resMap;  
  38.     }  
  39. }  

4、切面
[html]  view plain  copy
  1. package com.xueyou.ssm.aspect;  
  2.   
  3.   
  4. import com.xueyou.ssm.utils.Base;  
  5. import com.xueyou.ssm.utils.SessionTimeOutException;  
  6. import com.xueyou.ssm.utils.SysContent;  
  7. import org.apache.log4j.Logger;  
  8. import org.aspectj.lang.ProceedingJoinPoint;  
  9. import org.aspectj.lang.annotation.*;  
  10. import org.aspectj.lang.reflect.MethodSignature;  
  11. import org.springframework.stereotype.Component;  
  12. import javax.servlet.http.HttpSession;  
  13. import java.util.HashMap;  
  14. import java.util.Map;  
  15.   
  16. /**  
  17.  * Created by wuxueyou on 16/10/1.  
  18.  */  
  19. @Aspect  
  20. @Component("TestAspect")  
  21. public class TestAspect {  
  22.     private static Logger logger = Logger.getLogger(TestAspect.class);  
  23.   
  24.     //    @Around("execution(* com.xueyou.ssm.controller.*.*(..)) " +  
  25. //            "and !execution(* com.xueyou.ssm.controller.LoginController.ssmLogin(..)) " +  
  26. //            "and !execution(* com.xueyou.ssm.controller.UrlPageController.*(..))")  
  27.     @Around("@annotation(com.xueyou.ssm.annotation.ControllerAnnotationLogin)")  
  28.     public Object sessionTimeOutAdvice(ProceedingJoinPoint pjp) throws SessionTimeOutException{  
  29.         Object args[] = pjp.getArgs();  
  30.         Object result = null;  
  31.         String targetName = pjp.getTarget().getClass().getSimpleName();  
  32.         String methodName = pjp.getSignature().getName();  
  33.         logger.info("----------------执行方法-----------------");  
  34.         logger.info("类名:" + targetName + " 方法名:" + methodName);  
  35.   
  36.         HttpSession session = SysContent.getSession();  
  37.         if (session.getAttribute("username") != null) {  
  38.             try {  
  39.                 result = pjp.proceed(args);  
  40.             } catch (Throwable e) {  
  41.                 e.printStackTrace();  
  42.             }  
  43.             return result;  
  44.         } else {  
  45. //            System.out.println(((MethodSignature)pjp.getSignature()).getReturnType().getSimpleName().toString());  
  46.             String redirectStr = "login";  
  47.             String returnType = ((MethodSignature)pjp.getSignature()).getReturnType().getSimpleName().toString();  
  48.             if(returnType.equals("String")){  
  49.                 return redirectStr;  
  50.             }else if(returnType.equals("Map")){  
  51.                 Map<String,Object> resMap = new HashMap<>();  
  52.                 resMap.put("resCode", Base.MSG_CODE_SESSIONOUTOFDATE);  
  53.                 resMap.put("resMsg",Base.MSG_SESSIONOUTOFDATE);  
  54.                 return resMap;  
  55.             }else {  
  56.                 throw new SessionTimeOutException(Base.MSG_SESSIONOUTOFDATE);  
  57.             }  
  58.         }  
  59.     }  
  60. }  

5、自定义Exception
[java]  view plain  copy
  1. package com.xueyou.ssm.utils;  
  2.   
  3.   
  4. /** 
  5.  * Created by wuxueyou on 16/10/2. 
  6.  */  
  7. public class SessionTimeOutException extends Exception{  
  8.     public SessionTimeOutException(String message) {  
  9.         super(message);  
  10.     }  
  11. }  

6、springmvc统一处理Exception
[java]  view plain  copy
  1. package com.xueyou.ssm.utils;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.springframework.stereotype.Component;  
  5. import org.springframework.web.servlet.ModelAndView;  
  6. import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;  
  7.   
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. /** 
  12.  * Created by wuxueyou on 16/10/2. 
  13.  */  
  14. @Component("MyExceptionHandler")  
  15. public class MyExceptionHandler extends SimpleMappingExceptionResolver {  
  16.     private Logger logger = Logger.getLogger(MyExceptionHandler.class);  
  17.   
  18.     @Override  
  19.     protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {  
  20.         return getModelAndView("error", ex);  
  21.     }  
  22. }  

7、下面是运行结果:

登录成功后:


清除缓存,直接访问/web/main

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值