转载自: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. 基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别

      AdaBoost 算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高.   系统在技术上的三个贡献: 1.用简单的Haa ...

  2. ARM架构中的程序执行与调用

    ARM架构中的程序执行与调用 1. 几个名词 ABI : 可执行文件必须遵守的规范,以在特定执行环境中运行: 单独产生的可重定址的文件必须遵守的规范,以用来链接和执行. EABI: 适用于嵌入式环境的 ...

  3. ssh连接失败, 记下来原因和解决方案

    mac下使用secureCRT发现连接不了虚拟机上的linux 运行 ps -e | grep ssh,查看是否有sshd进程 如果没有,说明server没启动,通过 /etc/init.d/sshd ...

  4. c# 调取 c++ dll____c#调用dll

    1.以海康摄像头dll为例.(文章转载https://www.cnblogs.com/smartsensor/p/4343744.html) 海康SDK编程指南 目前使用的海康SDK包括IPC_SDK ...

  5. 在LaTex中插入电路图的方法(插入图片)

    主要的需求是要在文档中插入电路图. 有两种方法,一种是直接在LaTex中绘制电路图,使用的库主要是circ和circuitikz 另一种是在其他软件上绘制电路图,转成特定图像格式后,在Latex中插入 ...

  6. 【Docker 命令】- rmi命令

    docker rmi : 删除本地一个或多个镜像. 语法 docker rmi [OPTIONS] IMAGE [IMAGE...] OPTIONS说明: -f :强制删除: --no-prune : ...

  7. CURL & Fetch

    CURL & Fetch https://kigiri.github.io/fetch/ https://stackoverflow.com/questions/31039629/conver ...

  8. [Leetcode] 3.Longest Substring Without Repeating Characters(unordered_map)

    通过把未访问的结点放到unordered_map中来判断是否重复,代码如下: class Solution { public: int lengthOfLongestSubstring(string ...

  9. wpf拖拽

    简单拖拽的实现是,实现源控件的MouseDown事件,和目标控件Drop事件.调用DragDrop.DoDragDrop()以启动拖放操作,DragDrop.DoDragDrop()函数接受三个参数: ...

  10. 【python】用 sqlacodegen 将存在的数据库表 转化成model.py

    Flask的sqlalchemy对数据库表的模型提供了很多易用的方法.为了使用这些内容,需要将数据库表按照Flask识别的格式创建成Model,但是一般我们都是在已经创建好的数据库环境中开发Pytho ...