难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要。思索很久没有办法,后来在网上看到了解决办法。

思路是:

i. SysContext  成员变量 request,session,response 
    ii. Filter 目的是给 SysContext 中的成员赋值 
    iii.然后在AOP中使用这个SysContext的值

要用好,需要理解  ThreadLocal和  和Filter 执行顺序

1.aop获取request,response,session等

  1. public class SysContext {
  2. private static ThreadLocal<HttpServletRequest> requestLocal=new ThreadLocal<HttpServletRequest>();
  3. private static ThreadLocal<HttpServletResponse> responseLocal=new ThreadLocal<HttpServletResponse>();
  4. public static HttpServletRequest getRequest(){
  5. return requestLocal.get();
  6. }
  7. public static void setRequest(HttpServletRequest request){
  8. requestLocal.set(request);
  9. }
  10. public static HttpServletResponse getResponse(){
  11. return responseLocal.get();
  12. }
  13. public static void setResponse(HttpServletResponse response){
  14. responseLocal.set(response);
  15. }
  16. public static HttpSession getSession(){
  17. return (HttpSession)(getRequest()).getSession();
  18. }
  19. }

2.添加过滤器

  1. public class GetContextFilter implements Filter{
  2. @Override
  3. public void destroy() {
  4. }
  5. @Override
  6. public void doFilter(ServletRequest request, ServletResponse response,
  7. FilterChain chain) throws IOException, ServletException {
  8. SysContext.setRequest((HttpServletRequest)request);
  9. SysContext.setResponse((HttpServletResponse)response);
  10. chain.doFilter(request, response);
  11. }
  12. @Override
  13. public void init(FilterConfig config) throws ServletException {
  14. }
  15. }

3.配置web.xml

将这部分放置在最前面,这样可以过滤到所有的请求

  1. <filter>
  2. <filter-name>sessionFilter</filter-name>
  3. <filter-class>com.unei.filter.GetContextFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>sessionFilter</filter-name>
  7. <url-pattern>*</url-pattern>
  8. </filter-mapping>

4.spring aop before

从session中取出用户名,如果不存在,抛出异常跳转,将错误信息放到request中

  1. @Aspect
  2. public class AdminAspect {
  3. ActionContext context = ActionContext.getContext();
  4. HttpServletRequest request;
  5. HttpServletResponse response;
  6. @Before("execution(* com.unei.Action.AdminAction.getPrivileges(..))")
  7. public void adminPrivilegeCheck()
  8. throws Throwable {
  9. HttpSession session = SysContext.getSession();
  10. request = SysContext.getRequest();
  11. response = SysContext.getResponse();
  12. String userName = "";
  13. try {
  14. userName = session.getAttribute("userName").toString();
  15. if(userName==null||userName.equals(""))
  16. throw new Exception("no privilege");
  17. } catch (Exception ex) {
  18. request.setAttribute("msg", "{\"res\":\"" + "无权限" + "\"}");
  19. try {
  20. request.getRequestDispatcher("/jsp/json.jsp").forward(
  21. request, response);
  22. } catch (ServletException e) {
  23. e.printStackTrace();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. }

5.applicationContext.xml

      1. <bean id="adminAspect" class="com.unei.aop.AdminAspect"></bean>

转:spring aop 拦截业务方法,实现权限控制的更多相关文章

  1. spring aop 拦截业务方法,实现权限控制

    难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要.思索很久没有办法,后来在网上看到了 ...

  2. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  3. Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  4. Spring Security(17)——基于方法的权限控制

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  5. 使用Spring AOP实现业务依赖解耦

    Spring IOC用于解决对象依赖之间的解耦,而Spring AOP则用于解决业务依赖之间的解耦: 统一在一个地方定义[通用功能],通过声明的方式定义这些通用的功能以何种[方式][织入]到某些[特定 ...

  6. Spring Security教程之基于方法的权限控制(十二)

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  7. Spring实战(十)Spring AOP应用——为方法引入新功能、为对象引入新方法

    切面最基本的元素是通知和切点,切点用于准确定位应该在什么地方应用切面的通知. 1.Spring借助AspectJ的切点表达式语言来定义Spring切面 在Spring中,要使用AspectJ的切点表达 ...

  8. 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制

    权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...

  9. JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理

    1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...

随机推荐

  1. Linux下Redis安装与配置

    http://www.cnblogs.com/_popc/p/3684835.html

  2. 测试面试题集-测试用例设计:登录、购物车、QQ收藏表情、转账、充值、提现

    以下内容首发于微信公众号[ITester软件测试小栈]: 测试面试题集-2.测试用例设计 大家好 我是coco小锦鲤 上周五给大家分享了测试基础理论题 这个周五给大家分享测试用例设计题 测试用例的考察 ...

  3. N42-qq-林友埙-第二周作业

    1.Linux发行版的系统目录名称命名规则及用途 2.文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息 1.文件的元数据是指文件的属性.大小.创建时间.访问时间.属主属组等 ...

  4. VMware下Centos7-Minimal上网配置

    1.Centos7下载 http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso 2.推荐 ...

  5. 130道ASP.NET面试题(一)

    1 .简述 private,protected,public,internal修饰符的访问权限 答: private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部 ...

  6. ASP.NET Core 1.0: Deploy to IIS

    尽管ASP.NET最新的官方文档记录了如何Deploy to IIS,但是实际操作起来依旧磕磕绊绊.官方文档地址:https://docs.asp.net/en/latest/publishing/i ...

  7. [.NET] 常用的reusable library

    1. NAudio NAudio is an open source .NET audio and MIDI library, containing dozens of useful audio re ...

  8. nyoj 811-变态最大值 (max)

    811-变态最大值 内存限制:64MB 时间限制:1000ms 特判: No 通过数:6 提交数:15 难度:1 题目描述: Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这 ...

  9. tomcat-9.0.20缓存空间不足

    问题2:启动时候报这样的警告:警告 [main] org.apache.catalina.webresources.Cache.getResource 无法将位于[/WEB-INF/classes/t ...

  10. WPF 修改屏幕DPI,会触发控件重新加载Unload/Load

    修改屏幕DPI,会触发控件的Unloaded/Loaded 现象/重现案例 对Unloaded/Loaded的印象: FrameworkElement, 第一次加载显示时,会触发Loaded.元素被释 ...