实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或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)) {
//判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转
if(url!=null && !url.equals("") && ( url.indexOf("Login")<0 && 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;
for (int i = 0 ; 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("")) {
if ( url.indexOf("Login")<0 && url.indexOf("login")<0 ) {
return mapping.findForward("loginInterceptor");
}
return invocation.proceed();
}
else {
return invocation.proceed();
}
}
else {
return invocation.proceed();
}
}
}
分享到:
相关推荐
在本文中,我们将深入探讨如何在Spring Boot应用中使用拦截器(Interceptor)和过滤器(Filter)来处理用户的登录session。这两个组件都是Spring框架的重要部分,它们在处理HTTP请求和响应时发挥着关键作用。 首先...
本项目主要关注的是如何使用过滤器(Filter)和拦截器(Interceptor)来实现登录页面的控制与跳转。以下是对这些知识点的详细说明: 1. **SpringBoot**: SpringBoot是Spring框架的一个子项目,旨在简化Spring应用...
在Spring Boot应用中,过滤器(Filter)是用于处理HTTP请求和响应的重要组件。它们允许我们在请求被实际处理之前或之后进行拦截,从而实现诸如日志记录、安全控制、字符编码转换等多种功能。本篇文章将深入探讨...
在Java Web开发中,Spring MVC框架提供了两种机制来处理请求:拦截器(Interceptor)和过滤器(Filter)。它们都是在请求被控制器处理之前和之后执行的一系列预处理和后处理操作,但它们在功能、使用场景和工作原理...
为了实现用户权限的精细化管理,开发者常常会使用过滤器(Filter)来实现对用户访问资源的控制。本文将深入探讨如何在JSP中利用过滤器实现用户权限限制功能。 首先,我们需要了解过滤器的概念。在Servlet规范中,...
在本文中,我们将深入探讨如何使用过滤器来管理用户权限,这是Web应用程序中常见的安全实践。过滤器在Java Web开发中扮演着重要角色,尤其是在处理请求和响应时进行预处理和后处理。在这个主题中,我们将主要关注...
在Java Web开发中,过滤器(Filter)是一个强大的工具,它可以拦截HTTP请求并进行预处理,也可以在响应发送给客户端之前进行后处理。本话题主要关注如何使用Java Filter来限制用户的浏览权限,确保只有经过身份验证...
它基于Spring Framework 5、Project Reactor和Spring Boot 2构建,提供了一种简单的方式来为微服务架构定义路由规则,同时还支持过滤器链,可以进行权限校验、限流等操作。 1. 路由配置 在Spring Cloud Gateway中...
本文将深入探讨如何在Spring Cloud Gateway中自定义全局过滤器。 首先,我们需要了解Spring Cloud Gateway的基本架构。Gateway基于Spring Framework 5、Project Reactor和Spring WebFlux构建,它提供了一种高效且...
在Web开发领域,过滤器(Filter)和拦截器(Interceptor)是两种常见的机制,它们用于在请求被实际处理之前或之后执行特定的操作。这两种技术在Java Web应用中尤为常见,尤其是使用Servlet API或者Spring框架的时候...
这通常用于处理异常情况,如未登录用户尝试访问受保护的资源。 `postHandle()`方法在控制器方法执行后,但视图渲染前调用,可以用来处理一些后处理逻辑,如更新用户会话状态。而`afterCompletion()`方法则在整个...
在Web开发中,确保用户身份的安全性...总的来说,使用过滤器实现用户登录验证是一种常见的实践,它允许我们集中管理权限控制,提高代码的可维护性。同时,通过合理的配置和扩展,可以适应不同规模和需求的Web应用程序。
本案例中的"过滤器--控制不同权限用户访问不同文件夹代码.rar"是一个针对权限管理的具体应用,它允许开发者根据用户的权限级别决定他们可以访问哪些文件夹或资源。 过滤器的概念源自Java Servlet技术,它是Servlet ...
- **Filter Security Interceptor (FSI)**:基于HTTP请求过滤器的安全拦截器,用于处理请求的权限检查。 - **Authentication Manager**:负责用户身份验证。 - **Access Decision Manager (ADM)**:决定用户是否...
- 如果默认的过滤器不能满足需求,可以编写自定义过滤器,插入到Spring Security的过滤器链中,实现更复杂的逻辑,比如基于URL、方法或自定义条件的权限控制。 5. **JWT令牌**: - 为了支持API的无状态认证,可以...
在Spring Boot应用中,过滤器(Filter)、拦截器(Interceptor)和切面(Aspect)都是实现请求处理逻辑增强的重要手段,而定时任务则用于执行周期性的后台任务。下面将详细介绍这些概念及其用法。 1. **Spring Boot...
过滤器还可以与其他框架集成,比如Spring MVC中的Filter,可以用来处理跨域请求、GZIP压缩等。在实际开发中,过滤器的使用可以大大提高代码的可维护性和复用性,减少重复代码,同时提供了一种灵活的方式来增强Web...
通过过滤器判断用户权限是实现应用安全访问控制的一种常见手段,尤其在Web应用程序中非常普遍。下面我们将基于提供的文件信息,深入探讨如何通过过滤器来判断用户的权限。 ### 一、UserPermissionFilter类详解 ###...
过滤器在Spring MVC中扮演着请求预处理的角色,可以在请求到达控制器之前进行拦截,进行必要的处理,如检查用户是否已经登录。以下是构建登录过滤器的步骤: 1. **配置Maven项目**:在Idea中创建一个新的Maven项目...
**一、Filter过滤器基础** 1. **定义与工作原理**:`Filter`是Servlet规范的一部分,它在请求到达目标Servlet或JSP之前拦截请求,处理之后再将其传递给目标组件。`Filter`通过实现`javax.servlet.Filter`接口并重写...