在学spring3 mvc,做了个简单的CRUD,但是用户不登录也能直接访问任何页面。我的想法是写个SecurityInterceptor在preHandle中判断session是不是存在user对象。配置如下:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/*" /> <bean class="smartcrud.common.spring.SecurityInterceptor"> </bean> </mvc:interceptor> </mvc:interceptors>
代码如下:
public class SecurityInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // intercept HttpSession session = request.getSession(); if (session.getAttribute("user") == null) { throw new AuthorizationException(); } else { return true; } }
很快,我发现登录页面是不需要拦截的。。搜索了一下。<mvc:interceptor>没有提供配置exclude url的功能。只能在SecurityInterceptor中手动处理。。于是修改配置如下:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/*" /> <bean class="smartcrud.common.spring.SecurityInterceptor"> <property name="excludedUrls"> <list> <value>/login</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors>
修改代码如下:
public class SecurityInterceptor implements HandlerInterceptor { private List<String> excludedUrls; public void setExcludedUrls(List<String> excludedUrls) { this.excludedUrls = excludedUrls; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // excluded URLs: // see http://stackoverflow.com/questions/9908124/spring-mvc-3-interceptor-on-all-excluding-some-defined-paths String requestUri = request.getRequestURI(); for (String url : excludedUrls) { if (requestUri.endsWith(url)) { return true; } } // intercept HttpSession session = request.getSession(); if (session.getAttribute("user") == null) { // see http://stackoverflow.com/questions/12713873/spring-3-1-how-do-you-send-all-exception-to-one-page throw new AuthorizationException(); } else { return true; } }
这样以/login结尾的请求不做拦截处理。。
接下来需要处理非/login结尾的情况,此时我设计为抛出一个自定义的AuthorizationException异常。
public class AuthorizationException extends Exception { }
当抛出这个异常时,spring框架应该能够处理它,并将用户导向/WEB-INF/views/adminLogin.jsp页面以便让用户登录。。
搜索了一下资料,配置如下:
<bean id="handlerExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="smartcrud.common.exception.AuthorizationException">redirect:/login</prop> </props> </property> </bean>
注意这里的视图名为redirect:/login,spring会去找标记了@RequestMapping(value="/login")的方法来处理它。
代码如下:
@Controller public class LoginController { @Autowired private UserService userService; @RequestMapping(value = "/login", method = RequestMethod.GET) public String loginForm() { return "adminLogin"; }
如果handlerExceptionResolver那里的视图名没有redirect前缀,像这样
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="smartcrud.common.exception.AuthorizationException">/login</prop> </props> </property> </bean>
spring会尝试去找/WEB-INF/views/login.jsp。。如果恰好登录页面不叫这个名字,spring就会给出404,搞不懂spring为什么不去@RequestMapping中查找呢。
参考:
http://stackoverflow.com/questions/9908124/spring-mvc-3-interceptor-on-all-excluding-some-defined-paths
http://stackoverflow.com/questions/12713873/spring-3-1-how-do-you-send-all-exception-to-one-page
转载自:http://www.itniwo.net/blog/v/254207.html
相关推荐
在Spring Boot MVC中,我们可以创建自定义的Interceptor(拦截器)来处理JWT的验证。拦截器会在控制器处理方法之前执行,检查请求头中的JWT,并验证其有效性。如果令牌无效或已过期,拦截器可以阻止请求继续执行,...
本案例主要介绍的是如何将Spring框架与MyBatis集成,并结合Spring MVC和EasyUI来实现一个电子商城后台的用户管理功能。以下是对整个过程的详细解释: 1. **项目准备与依赖配置**: - 首先,从现有项目复制并重命名...
本案例主要介绍如何整合Spring框架、MyBatis和Spring MVC,并结合EasyUI实现一个电子商城后台的用户管理系统。首先,我们需要准备一个基础项目——digital-ssm,然后将其复制并改名为digital-um,调整部署名称为“/...
在这个名为"springmvc-login-interceptor"的项目中,我们关注的核心是Spring MVC的拦截器(Interceptor)功能,它允许开发者在请求被控制器处理之前或之后执行自定义逻辑。拦截器在实际应用中常用于权限验证、日志...
3. 使用注解驱动:Spring MVC支持注解驱动开发,通过注解可以使配置更加简洁。 4. 数据库集成:如果涉及数据库操作,还需要配置数据源、事务管理器以及DAO层的相关bean。 总之,Spring MVC提供了一套完整的MVC框架...
这个基于Spring MVC的简易用户管理案例为初学者提供了一个很好的学习平台,让我们一起深入探讨其中的关键知识点。 首先,Spring MVC是Spring框架的一个模块,主要负责处理HTTP请求并返回响应。它采用了模型-视图-...
3. **认证与授权**:Spring Security支持多种认证机制,如HTTP Basic Auth、Form Login、OAuth等,同时提供了细粒度的授权策略,如基于注解的访问控制(@Secured和@PreAuthorize)。 4. **表达式式访问控制**:...
在Spring MVC框架中,Interceptor是一个重要的组成部分,它可以在请求处理前、后执行一些操作。在SSO实现中,Interceptor主要负责检查用户的登录状态,并根据不同的情况进行相应的处理。 #### 三、实现步骤 ##### ...
- **Spring MVC**:与Spring Web MVC无缝集成,轻松保护控制器方法。 - **Spring JDBC/ORM**:与Spring的数据访问层集成,进行用户认证和授权信息的持久化。 - **Spring AOP**:利用Spring的AOP功能实现安全切面...
3. `spring-aop.jar`:支持AOP(面向切面编程),如声明式事务管理。 4. `spring-context.jar`:扩展了Spring核心,提供ApplicationContext和更多特性。 5. `spring-context-support.jar`:为Spring MVC提供额外支持...
3. **拦截器与过滤器**:Spring MVC的权限验证通常结合拦截器(`HandlerInterceptor`)和过滤器(`Filter`)一起使用。`Filter`可以用于全局的请求处理,如登录检查、CSRF防护等,而`Interceptor`则可以对特定的...
</mvc:interceptor> </mvc:interceptors> ``` 在这个例子中,`/**` 表示拦截所有请求。如果只想拦截特定路径,可以调整 `mvc:mapping` 的值。 拦截器的执行顺序取决于它们在配置文件中的顺序,先声明的拦截器会先...
在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,用于在请求被处理之前或之后执行自定义逻辑。它提供了一种机制,可以对HTTP请求进行预处理和后处理,例如进行权限验证、日志记录、性能统计等。在这个...
在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,用于在请求被控制器处理之前或之后执行特定的逻辑。它可以用来实现诸如权限验证、日志记录、性能统计、缓存控制等多种功能。在这个主题中,我们将深入...
3. **安全控制**:为了防止跨站请求伪造(CSRF)等安全问题,Spring Security可以集成到Spring MVC项目中。它提供了一套完整的安全解决方案,包括身份验证、授权、会话管理等。登录成功后,Spring Security会生成一...
Struts2、Spring3和Hibernate3是Java Web开发中的三个重要框架,它们分别负责MVC模式中的表现层、业务层和服务层。这个压缩包提供的示例下载,旨在帮助开发者快速理解这三个框架的集成与协同工作。 Struts2是Apache...
- **MVC集成**:与Spring MVC紧密集成,提供便捷的Web安全配置。 7. **配置** - **XML配置**:传统的配置方式,通过Spring的XML配置文件进行设置。 - **Java配置**:从Spring Security 3.1.0开始,引入了Java...
Struts2、Spring3和Mybatis3是Java Web开发中常用的三大框架,它们各自负责不同的职责,协同工作能构建出高效、灵活的应用。Struts2是MVC(Model-View-Controller)架构模式的一种实现,负责处理用户请求并展现视图...
Spring MVC框架中,拦截器是一种非常重要的机制,能够在请求处理的不同阶段进行拦截和处理。下面,我们将详细介绍Spring MVC拦截器的实现和用户登陆例子。 一、拦截器的实现 在Spring MVC中,拦截器是通过实现...
文档中还会涵盖Spring Security与其他Spring模块的集成,例如Spring MVC和Spring Data,以及Spring Security与WebSocket、RESTful服务的整合。同时,它会讲解如何处理安全性相关的异常,以及如何实现自定义的安全...