转载自:http://pouyang.iteye.com/blog/695429

实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面。 

比较好的做法是不管什么人都不能直接访问jsp页面,要访问就通过action,这样就变成了一个实实在在的权限控制了。 

那么就有3种方法可以解决楼主的问题 

1,直接使用filter 

2,直接使用webwork的interceptor, 

3,将action交给spring管理,使用spring的Aop机制 



让用户可以直接访问jsp本来就违反了mvc的本意了 

1 直接使用filter 

web.xml配置

  1. <filter>
  2. <filter-name>SecurityServlet</filter-name>
  3. <filter-class>com.*.web.servlet.SecurityServlet</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>SecurityServlet</filter-name>
  7. <url-pattern>*.jsp</url-pattern>
  8. </filter-mapping>
  9. <filter-mapping>
  10. <filter-name>SecurityServlet</filter-name>
  11. <url-pattern>*.do</url-pattern>
  12. </filter-mapping>

SecurityServlet 类

  1. package com.*.web.servlet;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import javax.servlet.http.HttpSession;
  13. public class SecurityServlet extends HttpServlet implements Filter {
  14. private static final long serialVersionUID = 1L;
  15. public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
  16. HttpServletRequest request=(HttpServletRequest)arg0;
  17. HttpServletResponse response  =(HttpServletResponse) arg1;
  18. HttpSession session = request.getSession(true);
  19. String usercode = (String) request.getRemoteUser();// 登录人
  20. String user_role = (String)session.getAttribute("role");//登录人角色
  21. String url=request.getRequestURI();
  22. if(usercode==null || "".equals(usercode) || user_role == null || "".equals(user_role)) {
  23. //判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转
  24. && url.indexOf("login")<0 )) {
  25. response.sendRedirect(request.getContextPath() + "/login.jsp");
  26. return ;
  27. }
  28. }
  29. arg2.doFilter(arg0, arg1);
  30. return;
  31. }
  32. public void init(FilterConfig arg0) throws ServletException {
  33. }
  34. }

配置中的filter-mapping,定义的是需过滤的请求类型,上面的配置即过滤所有对jsp页面和action的请求。过滤器的实现与struts2、spring框架无关,在用户请求被相应前执行,在过滤器中,可使用response.sendRedirect("")等方法 



跳转到需要的链接,如登录页面、错误页面等,不需要跳转时,arg2.doFilter(arg0, arg1);即可继续执行用户的请求。注意使用filter时避免连续两次跳转,否则会报java.lang.IllegalStateException错误,具体配置方法网上有,除非必要,不建议使用/*(过滤所有访问)的配置方式,这样配置,图片、js文件、css文件等访问都会被过滤 





2 Spring拦截 



Spring配置

  1. <bean id="springSessionInterceptor" class="com.*.web.servlet.SpringLoginInterceptor" >
  2. </bean>
  3. <bean id="autoPorxyFactoryBean1"
  4. class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  5. <property name="interceptorNames">
  6. <list>
  7. <value>springLoginInterceptor</value>
  8. </list>
  9. </property>
  10. <property name="beanNames" >
  11. <list>
  12. <value>*Controller</value>
  13. </list>
  14. </property>
  15. </bean>

SpringLoginInterceptor实现类

  1. package com.web.servlet;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import javax.servlet.http.HttpSession;
  5. import org.aopalliance.intercept.MethodInterceptor;
  6. import org.aopalliance.intercept.MethodInvocation;
  7. import org.apache.log4j.Logger;
  8. import org.apache.struts.action.ActionMapping;
  9. public class SpringLoginInterceptor implements MethodInterceptor {
  10. private static final Logger log = Logger
  11. .getLogger(SpringLoginInterceptor .class);
  12. @Override
  13. public Object invoke(MethodInvocation invocation) throws Throwable {
  14. log.info("拦截开始!");
  15. Object[] args = invocation.getArguments();
  16. HttpServletRequest request = null;
  17. HttpServletResponse response = null;
  18. ActionMapping  mapping = null;
  19. ; i < args.length ; i++ )    {
  20. if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
  21. if (args[i] instanceof HttpServletResponse) response = (HttpServletResponse)args[i];
  22. if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
  23. }
  24. if (request != null && mapping != null) {
  25. String url=request.getRequestURI();
  26. HttpSession session = request.getSession(true);
  27. String usercode = (String) request.getRemoteUser();// 登录人
  28. String user_role = (String)session.getAttribute("user_role");//登录人角色
  29. if (usercode == null || usercode.equals("")) {
  30. && url.indexOf("login")<0 ) {
  31. return mapping.findForward("loginInterceptor");
  32. }
  33. return invocation.proceed();
  34. }
  35. else {
  36. return invocation.proceed();
  37. }
  38. }
  39. else {
  40. return invocation.proceed();
  41. }
  42. }
  43. }

Spring Filter过滤器,Spring拦截未登录用户权限限制的更多相关文章

  1. 防止未登录用户操作—struts2拦截器简单实现(转)

    原文地址:http://blog.csdn.net/zhutulang/article/details/38351629 尊重原创,请访问原地址 一般,我们的web应用都是只有在用户登录之后才允许操作 ...

  2. Django中间件拦截未登录url

    1.利用装饰器在视图中拦截未登录的url @login_required(login_url='/user/login/') def homepage(request): pass 这种方法适合于程序 ...

  3. 自定义HttpModule,用于未登录用户,不弹出Windows认证窗口,而是跳转回SSO站点

    2012年的一篇随笔记录,可以学习到如何自定义HttpModule,而具体里面针对需求开发的代码,可能未必能让大伙了解到什么,可快速扫描而过. using System; using System.W ...

  4. 前后端分离项目shiro的未登录和权限不足

    在前后端分离的项目中.前端代码和后端代码几乎不在同一个目录下,甚至不是在一台服务器上:我这个项目部署在linux.同一台服务器,不同目录下:所有的页面跳转由前台路由,后台只是提供返回的数据: 干货↓  ...

  5. spring filter过滤器

    1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...

  6. spring boot 过滤器、拦截器的区别与使用

    原文:https://blog.csdn.net/heweimingming/article/details/79993591 拦截器与过滤器的区别: 1.过滤器和拦截器触发时机不一样,过滤器是在请求 ...

  7. struts 用拦截器进行用户权限隔离,未登录用户跳到登录界面 *** 最爱那水货

    一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.对于个别页面来说,可能不需要进行拦截,此时,如果项目采用struts view ...

  8. Spring Security——核心类简介——获得登录用户的相关信息

    核心类简介 目录 1.1     Authentication 1.2     SecurityContextHolder 1.3     AuthenticationManager和Authenti ...

  9. SSH—Struts2拦截器的应用(防止未登录用户进行操作)

    前言 类似于京东.淘宝这些平台,如果单纯的去浏览页面上的一些商品显示,一点问题都没有,但是当你点击商品的订单详情或者想查看一下自己的购物车,那么就会出现通过登录进去的界面,这个就是今天要说的这个拦截器 ...

随机推荐

  1. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  2. 5.hadoop常用命令

    1. 单独启动和关闭hadoop服务 启动名称节点 #hadoop-daemon.sh start namenode 启动数据节点 #hadoop-daemons.sh start datanode ...

  3. [C++] OOP - Base and Derived Classes

    There is a base class at the root of the hierarchy, from which the other class inherit, directly or ...

  4. 视频播放截图及简要文字介绍——Thunder团队

    视频播放截图及简要文字介绍 图一:团队Logo ——从此我们有了自己的标志 图二:扫描本地书籍 ——可阅读本地的喜爱书籍 图三:在本地添加自己喜爱的图书 ——将自己喜爱的书籍加入书架,方便阅读 图四: ...

  5. java集合类小结

    1 集合的框架体系 List简介 集合的使用场合 List(链表|线性表)和Set(集) java.util.Collection ---| Collection 描述所有接口的共性 ----| Li ...

  6. python获取指定长度的字符串

    from random import Random def random_str(randomlength=31): str = '' chars = 'abcdefghijklmnopqrstuvw ...

  7. fuck the browser mode

    使用了source insight 4有一段时间了,今天用着突然发现我的鼠标移动到变量.函数.自定义的类型上时,单击鼠标左键直接就跳到了定义处,很像是按住了Ctrl再单击鼠标,用得极其不舒服,开始怀疑 ...

  8. Android 多屏幕适配 dp和px的关系 最好用dp

    Android 多屏幕适配 dp和px的关系 一直以来别人经常问我,android的多屏幕适配到底是怎么弄,我也不知道如何讲解清楚,或许自己也是挺迷糊. 以下得出的结论主要是结合官方文档进行分析的ht ...

  9. Signal函数

    Signal函数: 这个函数是一种系统调用,就是告诉系统发生中断的时候用该干嘛.第一个参数就是信号的编号,第二个参数就是信号的指针. 原型: #include <signal.h> voi ...

  10. Android ListView的优化

    最近的项目中有通讯录这个模块,里面的通讯录涉及的联系人数量很大,导致在加载页面的时候有点卡,所以就必须得进行优化,优化的最终实现理论是什么?就是让ListView一次性加载的数据较少,后续根据用户操作 ...