转载自: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. Calculator 2

    github地址:https://github.com/YooRarely/object-oriented.git 新增: 计算类(拥有计算功能) 采用符号优先级计算方法 对符号不匹配的如 -2 ,自 ...

  2. spring框架(1)— 依赖注入

    依赖注入 spring核心容器就是一个超级大工厂,所以的对象(数据源.hibernate SessionFactory等基础性资源)都会被当做spring核心容器的管理对象——spring把容器中的一 ...

  3. css那些事儿2 经典两列布局

    <!DOCTYPE html> <html> <head> <title></title> <link rel="style ...

  4. C# Winform防止闪频和再次运行

    其实想实现只允许运行一个实例很简单,就是从program的入口函数入手.有两种情况: 第一种,用户运行第二个的时候给一个提示: using System; using System.Collectio ...

  5. 【Linux】- CentOS安装Mysql 5.7

    CentOS7默认数据库是mariadb,而不是mysql.CentOS7的yum源中默认是没有mysql的.所以不能使用yum install直接安装. 下载mysql的repo源 cd /usr/ ...

  6. iis7 appcmd命令

    iis中提供了appcmd命令 可以通过命令行来配置iis appcmd.exe 默认路径在 c:\windows\system32\inetsrv\下 若要回收应用程序池,请使用以下语法: appc ...

  7. C跟C++

    工作以来几乎就只写C,下周开始的新工作可能就要开始写C++啦~ C: C++: 1.template 2.多态.重载.继承 3.虚函数 C++内存布局 看两张耗子的图片就清楚了.其中虚函数表一般放在数 ...

  8. ubuntu 只有客人会话登录(第一次深刻感受文件权限的威力 )

    为了测试docker的挂载权限,把宿主机的/etc/passwd文件挂载到了虚机当中,进入虚机想看下能不能直接对我宿主机上的文件进行操作,把/etc/passwd删掉了最后十行...结果宿主机上的/e ...

  9. c/c++中的关键字(static、const、inline、friend)

    static:1.a.c语言中static修饰的局部变量在编译时赋初始值,只赋初始值一次,在函数运行时已有初值,每次调用函数时不用重新赋值,指示保留上次 函 数调用结束时的值. 如果定义局部变量不赋初 ...

  10. 【刷题】BZOJ 3175 [Tjoi2013]攻击装置

    Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照"日"字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1), ...