转:spring aop 拦截业务方法,实现权限控制
难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要。思索很久没有办法,后来在网上看到了解决办法。
思路是:
i. SysContext 成员变量 request,session,response
ii. Filter 目的是给 SysContext 中的成员赋值
iii.然后在AOP中使用这个SysContext的值
要用好,需要理解 ThreadLocal和 和Filter 执行顺序
1.aop获取request,response,session等
- public class SysContext {
- private static ThreadLocal<HttpServletRequest> requestLocal=new ThreadLocal<HttpServletRequest>();
- private static ThreadLocal<HttpServletResponse> responseLocal=new ThreadLocal<HttpServletResponse>();
- public static HttpServletRequest getRequest(){
- return requestLocal.get();
- }
- public static void setRequest(HttpServletRequest request){
- requestLocal.set(request);
- }
- public static HttpServletResponse getResponse(){
- return responseLocal.get();
- }
- public static void setResponse(HttpServletResponse response){
- responseLocal.set(response);
- }
- public static HttpSession getSession(){
- return (HttpSession)(getRequest()).getSession();
- }
- }
2.添加过滤器
- public class GetContextFilter implements Filter{
- @Override
- public void destroy() {
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- SysContext.setRequest((HttpServletRequest)request);
- SysContext.setResponse((HttpServletResponse)response);
- chain.doFilter(request, response);
- }
- @Override
- public void init(FilterConfig config) throws ServletException {
- }
- }
3.配置web.xml
将这部分放置在最前面,这样可以过滤到所有的请求
- <filter>
- <filter-name>sessionFilter</filter-name>
- <filter-class>com.unei.filter.GetContextFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>sessionFilter</filter-name>
- <url-pattern>*</url-pattern>
- </filter-mapping>
4.spring aop before
从session中取出用户名,如果不存在,抛出异常跳转,将错误信息放到request中
- @Aspect
- public class AdminAspect {
- ActionContext context = ActionContext.getContext();
- HttpServletRequest request;
- HttpServletResponse response;
- @Before("execution(* com.unei.Action.AdminAction.getPrivileges(..))")
- public void adminPrivilegeCheck()
- throws Throwable {
- HttpSession session = SysContext.getSession();
- request = SysContext.getRequest();
- response = SysContext.getResponse();
- String userName = "";
- try {
- userName = session.getAttribute("userName").toString();
- if(userName==null||userName.equals(""))
- throw new Exception("no privilege");
- } catch (Exception ex) {
- request.setAttribute("msg", "{\"res\":\"" + "无权限" + "\"}");
- try {
- request.getRequestDispatcher("/jsp/json.jsp").forward(
- request, response);
- } catch (ServletException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
5.applicationContext.xml
- <bean id="adminAspect" class="com.unei.aop.AdminAspect"></bean>
转:spring aop 拦截业务方法,实现权限控制的更多相关文章
- spring aop 拦截业务方法,实现权限控制
难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要.思索很久没有办法,后来在网上看到了 ...
- 从零开始学 Java - Spring AOP 拦截器的基本实现
一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...
- Java - Spring AOP 拦截器的基本实现
一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...
- Spring Security(17)——基于方法的权限控制
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- 使用Spring AOP实现业务依赖解耦
Spring IOC用于解决对象依赖之间的解耦,而Spring AOP则用于解决业务依赖之间的解耦: 统一在一个地方定义[通用功能],通过声明的方式定义这些通用的功能以何种[方式][织入]到某些[特定 ...
- Spring Security教程之基于方法的权限控制(十二)
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- Spring实战(十)Spring AOP应用——为方法引入新功能、为对象引入新方法
切面最基本的元素是通知和切点,切点用于准确定位应该在什么地方应用切面的通知. 1.Spring借助AspectJ的切点表达式语言来定义Spring切面 在Spring中,要使用AspectJ的切点表达 ...
- 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制
权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...
- JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理
1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...
随机推荐
- Linux下Redis安装与配置
http://www.cnblogs.com/_popc/p/3684835.html
- 测试面试题集-测试用例设计:登录、购物车、QQ收藏表情、转账、充值、提现
以下内容首发于微信公众号[ITester软件测试小栈]: 测试面试题集-2.测试用例设计 大家好 我是coco小锦鲤 上周五给大家分享了测试基础理论题 这个周五给大家分享测试用例设计题 测试用例的考察 ...
- N42-qq-林友埙-第二周作业
1.Linux发行版的系统目录名称命名规则及用途 2.文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息 1.文件的元数据是指文件的属性.大小.创建时间.访问时间.属主属组等 ...
- VMware下Centos7-Minimal上网配置
1.Centos7下载 http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso 2.推荐 ...
- 130道ASP.NET面试题(一)
1 .简述 private,protected,public,internal修饰符的访问权限 答: private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部 ...
- ASP.NET Core 1.0: Deploy to IIS
尽管ASP.NET最新的官方文档记录了如何Deploy to IIS,但是实际操作起来依旧磕磕绊绊.官方文档地址:https://docs.asp.net/en/latest/publishing/i ...
- [.NET] 常用的reusable library
1. NAudio NAudio is an open source .NET audio and MIDI library, containing dozens of useful audio re ...
- nyoj 811-变态最大值 (max)
811-变态最大值 内存限制:64MB 时间限制:1000ms 特判: No 通过数:6 提交数:15 难度:1 题目描述: Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这 ...
- tomcat-9.0.20缓存空间不足
问题2:启动时候报这样的警告:警告 [main] org.apache.catalina.webresources.Cache.getResource 无法将位于[/WEB-INF/classes/t ...
- WPF 修改屏幕DPI,会触发控件重新加载Unload/Load
修改屏幕DPI,会触发控件的Unloaded/Loaded 现象/重现案例 对Unloaded/Loaded的印象: FrameworkElement, 第一次加载显示时,会触发Loaded.元素被释 ...