转载自: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. httpd 2.2.15 添加流媒体模块

    项目中使用的一直都是 httpd  2.2.15  用于播放视频资源,近期有个新产品上线发现快进视频会出现卡顿情况,因此添加了流媒体模块.(怀疑是新产品中的播放器进行了更改) 原文:http://li ...

  2. python 抓取网上OJ试题

    学校工作需要,需架设一台内网OJ服务器,采用了开源的hustoj.试题下载了hustoj的freeprblem的xml文件.导入时出现很多错误,不知什么原因.另外要将历年noip复赛试题加上去,但苦于 ...

  3. Python 零碎信息-基础 02

    1. range xrange 的差别 1.1 range 返回列表对象. 1.2 xrange 返回xrange对象  不需要返回列表里面的值, 节省内存. >>> range(1 ...

  4. 3dContactPointAnnotationTool开发日志(二十)

      为了使工具更人性化,我又在每个status的text上绑了个可以拖拽实现值改变的脚本,但是不知道为啥rotx那个值越过+-90范围后连续修改就会产生抖动的现象,试了很多方法也没能弄好,不过实际用起 ...

  5. python爬虫从入门到放弃(五)之 正则的基本使用(转)

    什么是正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是 事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符”,这个“规则字符” 来表达对字符的一种过滤逻辑. 正则并不是pyth ...

  6. extract函数行结果

    $arr2=array('a'=>'aaaa','b'=>'bbbb','c'=>'cccc','d'=>'dddd','e'=>'eeeee','b'=>'fff ...

  7. Python2中编码错误---重组人表皮生长因子凝胶(易孚格式转化为UTF-8

    在python2的使用中,总会遇到各种各样的编码问题,这也是使用Python2最头疼的一件事情,幸好python3解决了编码的问题. 下面我在爬虫时遇到的类似重组人表皮生长 ...

  8. [C/C++] C++抽象类

    转自:http://www.cnblogs.com/dongsheng/p/3343939.html 一.纯虚函数定义 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己 ...

  9. 能选择日期范围js控件

    html页面中使用日期控件是常有的事,好控件能使用开发变的快捷,下面是在开发过程中发现的几款日期控件,比较不错,收藏 1.基于bootstrap的jQuery日期范围选择插件 2.jQuery多功能日 ...

  10. WPF数据视图学习

    当你绑定集合到ItemsControl,数据视图被安静地在幕后创造.视图位于数据源和绑定控件之间.数据视图是通往数据源的一个窗口.它跟踪当前项目,它支持诸如排序,过滤,和分组特征.这些特征独立于数据对 ...