Spring Filter过滤器,Spring拦截未登录用户权限限制
转载自: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配置
- <filter>
- <filter-name>SecurityServlet</filter-name>
- <filter-class>com.*.web.servlet.SecurityServlet</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>SecurityServlet</filter-name>
- <url-pattern>*.jsp</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>SecurityServlet</filter-name>
- <url-pattern>*.do</url-pattern>
- </filter-mapping>
SecurityServlet 类
- package com.*.web.servlet;
- import java.io.IOException;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- public class SecurityServlet extends HttpServlet implements Filter {
- private static final long serialVersionUID = 1L;
- public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
- HttpServletRequest request=(HttpServletRequest)arg0;
- HttpServletResponse response =(HttpServletResponse) arg1;
- HttpSession session = request.getSession(true);
- String usercode = (String) request.getRemoteUser();// 登录人
- String user_role = (String)session.getAttribute("role");//登录人角色
- String url=request.getRequestURI();
- if(usercode==null || "".equals(usercode) || user_role == null || "".equals(user_role)) {
- //判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转
- && url.indexOf("login")<0 )) {
- response.sendRedirect(request.getContextPath() + "/login.jsp");
- return ;
- }
- }
- arg2.doFilter(arg0, arg1);
- return;
- }
- public void init(FilterConfig arg0) throws ServletException {
- }
- }
配置中的filter-mapping,定义的是需过滤的请求类型,上面的配置即过滤所有对jsp页面和action的请求。过滤器的实现与struts2、spring框架无关,在用户请求被相应前执行,在过滤器中,可使用response.sendRedirect("")等方法
跳转到需要的链接,如登录页面、错误页面等,不需要跳转时,arg2.doFilter(arg0, arg1);即可继续执行用户的请求。注意使用filter时避免连续两次跳转,否则会报java.lang.IllegalStateException错误,具体配置方法网上有,除非必要,不建议使用/*(过滤所有访问)的配置方式,这样配置,图片、js文件、css文件等访问都会被过滤
2 Spring拦截
Spring配置
- <bean id="springSessionInterceptor" class="com.*.web.servlet.SpringLoginInterceptor" >
- </bean>
- <bean id="autoPorxyFactoryBean1"
- class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="interceptorNames">
- <list>
- <value>springLoginInterceptor</value>
- </list>
- </property>
- <property name="beanNames" >
- <list>
- <value>*Controller</value>
- </list>
- </property>
- </bean>
SpringLoginInterceptor实现类
- package com.web.servlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- import org.aopalliance.intercept.MethodInterceptor;
- import org.aopalliance.intercept.MethodInvocation;
- import org.apache.log4j.Logger;
- import org.apache.struts.action.ActionMapping;
- public class SpringLoginInterceptor implements MethodInterceptor {
- private static final Logger log = Logger
- .getLogger(SpringLoginInterceptor .class);
- @Override
- public Object invoke(MethodInvocation invocation) throws Throwable {
- log.info("拦截开始!");
- Object[] args = invocation.getArguments();
- HttpServletRequest request = null;
- HttpServletResponse response = null;
- ActionMapping mapping = null;
- ; i < args.length ; i++ ) {
- if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
- if (args[i] instanceof HttpServletResponse) response = (HttpServletResponse)args[i];
- if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
- }
- if (request != null && mapping != null) {
- String url=request.getRequestURI();
- HttpSession session = request.getSession(true);
- String usercode = (String) request.getRemoteUser();// 登录人
- String user_role = (String)session.getAttribute("user_role");//登录人角色
- if (usercode == null || usercode.equals("")) {
- && url.indexOf("login")<0 ) {
- return mapping.findForward("loginInterceptor");
- }
- return invocation.proceed();
- }
- else {
- return invocation.proceed();
- }
- }
- else {
- return invocation.proceed();
- }
- }
- }
Spring Filter过滤器,Spring拦截未登录用户权限限制的更多相关文章
- 防止未登录用户操作—struts2拦截器简单实现(转)
原文地址:http://blog.csdn.net/zhutulang/article/details/38351629 尊重原创,请访问原地址 一般,我们的web应用都是只有在用户登录之后才允许操作 ...
- Django中间件拦截未登录url
1.利用装饰器在视图中拦截未登录的url @login_required(login_url='/user/login/') def homepage(request): pass 这种方法适合于程序 ...
- 自定义HttpModule,用于未登录用户,不弹出Windows认证窗口,而是跳转回SSO站点
2012年的一篇随笔记录,可以学习到如何自定义HttpModule,而具体里面针对需求开发的代码,可能未必能让大伙了解到什么,可快速扫描而过. using System; using System.W ...
- 前后端分离项目shiro的未登录和权限不足
在前后端分离的项目中.前端代码和后端代码几乎不在同一个目录下,甚至不是在一台服务器上:我这个项目部署在linux.同一台服务器,不同目录下:所有的页面跳转由前台路由,后台只是提供返回的数据: 干货↓ ...
- spring filter过滤器
1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...
- spring boot 过滤器、拦截器的区别与使用
原文:https://blog.csdn.net/heweimingming/article/details/79993591 拦截器与过滤器的区别: 1.过滤器和拦截器触发时机不一样,过滤器是在请求 ...
- struts 用拦截器进行用户权限隔离,未登录用户跳到登录界面 *** 最爱那水货
一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.对于个别页面来说,可能不需要进行拦截,此时,如果项目采用struts view ...
- Spring Security——核心类简介——获得登录用户的相关信息
核心类简介 目录 1.1 Authentication 1.2 SecurityContextHolder 1.3 AuthenticationManager和Authenti ...
- SSH—Struts2拦截器的应用(防止未登录用户进行操作)
前言 类似于京东.淘宝这些平台,如果单纯的去浏览页面上的一些商品显示,一点问题都没有,但是当你点击商品的订单详情或者想查看一下自己的购物车,那么就会出现通过登录进去的界面,这个就是今天要说的这个拦截器 ...
随机推荐
- C语言文件进阶操作
Description文件a.dic.b.dic.c.dic中分别存有张三的三科成绩,每个文件都是16字节:前8个字节存储其英文名字zhangsan,后面是一个空格,其后的2个字节存储其年龄(文本方式 ...
- ACM 第十三天
训练赛题目 题目地址:https://odzkskevi.qnssl.com/415c275cb0a15fcb4ede21b8cb5297de?v=1533963116 A题代码: #includ ...
- <Effective C++>读书摘要--Ctors、Dtors and Assignment Operators<一>
<Item 5> Know what functions C++ silently writes and calls 1.If you don't declare them yoursel ...
- 3DMAX贴图无法显示
问题描述:我在点击"将材质指定给选定对象"按钮之后,模型只是变灰了,没有显示出我贴的图. 原因是:没有显示贴图. 我的解决方案:点击材质编辑器里面的"视口中显示敏感处理材 ...
- RHEL 6.4(i386)安装MySQL 5.6的方法
- 【Linux】- apt-get命令
apt-get,是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸载软件或操作系统. Advanced Package Tool,又名apt-g ...
- 统一日志系统 Log4Net/ExceptionLess
一. 写在前面 本文Log4Net介绍了基础的方式,大数据量生产环境不能使用,中等日志量请日志单库. 希望爱技术的你不要错过exceptionless和ELK 第四节开始简单配置大牛们推荐的了Ex ...
- dwarf是怎样处理的栈帧?
dwarf是如何处理的栈帧呢? 首先看下非dwarf的情况是如何处理栈帧的: 1 3623804982590 0x3e90 [0xb0]: PERF_RECORD_SAMPLE(IP, 0x1): 1 ...
- 细说匿名内部类引用方法局部变量时为什么需要声明为final
一.前言 在研究公司某个项目的源码,看到前人使用了挺多内部类,内部类平时我用的比较多的是匿名内部类,平时用的多的是匿名内部类,其他形式的用的比较少,然后我就有个疑惑:到底内部类是基于什么样的考虑,才让 ...
- [剑指Offer] 61.序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *r ...