转载自: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. 操作系统及Python解释器工作原理讲解

    操作系统介绍 操作系统位于计算机硬件与应用软件之间 是一个协调.管理.控制计算机硬件资源与软件资源的控制程序 操作系统功能: 控制硬件 把对硬件复杂的操作封装成优美简单的接口(文件),给用户或者应用程 ...

  2. android课程第一节(TextView控件使用)

    TextView控件使用 一.TextView基本使用(创建方式) 1.在程序中创建TextView对象 如下代码: @Override protected void onCreate(Bundle ...

  3. 软件工程课堂作业(五)——终极版随机产生四则运算题目(C++)

    一.升级要求:让程序能接受用户输入答案,并判定对错.最后给出总共对/错的数量. 二.设计思想: 1.首先输入答案并判断对错.我想到的是定义两个数组,一个存放用户算的结果,另一个存放正确答案.每输出一道 ...

  4. 将MathType公式转换为LaTex格式

    LaTex编辑公式不够直观,常常会因为结构复杂导致数据或者符号出错,使用MathType编辑公式后再直接转换成LaTex代码可以避免这个问题. 一.首先在MathType中编辑公式 二.然后点击参数— ...

  5. centos7 安装 httpd并打开测试页

    systemctl start firewalld.service#启动firewallsystemctl stop firewalld.service#停止firewallsystemctl dis ...

  6. git工具SourceTree工作流

    分支模型 master 用来最终上线的分支,最终发布版本,整个项目中有且只有一个 develop 项目中用来开发的分支,原则上项目中有且只有一个,develop 分支下面的分支是经常变化的,会创建新的 ...

  7. ASP.NET MVC 多语言解决方案

    1:打开VS,新建ASP.NET MVC4项目 2:创建一个放本地化资源的文件夹并命名为"Language",右键选择添加新项,选择资源文件并命名为"Com" ...

  8. 深入学习 Redis系列

    深入学习 Redis(1):Redis 内存模型 深入学习 Redis(2):持久化 深入学习 Redis(3):主从复制 深入学习 Redis(4):哨兵

  9. 手机端浏览器适配,background 背景平铺 ,有的出不来

    .mobilePage .report { background: url(../images/mobile-report.png) repeat; background-size: 100% :/* ...

  10. vmware 虚拟机下安装centOS7.0

    当时安装的是 CentOS-7.0-1406-x86_64-DVD.iso 这个版本的镜像,提示: 您已经配置此虚拟机使用64位客户操作系统.但是64位操作系统不可用.此主机具有虚拟化支持能力的,可是 ...