【Spring MVC】Spring MVC,阻止直接访问jsp,使用Interceptor登录拦截

问题描述:

在Java Web项目中,用户可访问Url一般只有一个,即index或login。而用户的其他Url请求都会引导到index页。如何来避免未登录用户直接访问Spring的Conroller和jsp文件?

解决方案:

一、阻止用户访问jsp。

Spring的MVC模式是不提倡直接通过URL形式访问.jsp页面的,建议通过Controller跳转至View页面。

把jsp文件放在WEB-INF目录下,js和css等资源文件放在WEB-INF的同级目录下,WEB-INF对用户不可见,可以起到隔离作用。

同时修改mvc配置文件,配置jsp的路径。

1     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
2         <property name="prefix" value="/WEB-INF/jsp/" />
3         <property name="suffix" value=".jsp" />
4     </bean>

配置资源文件夹的路径,以便jsp能访问到所引用的静态资源文件。

<mvc:resources mapping="/**" location="/resources" />

二、Interceptor登录拦截

Spring拦截器介绍:

SpringMVC中使用Interceptor拦截器

拦截器HandlerInterceptor接口有三个回调方法

1.preHandle方法,顾名思义,该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。

2.postHandle方法,由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion 方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行。

3.afterCompletion方法,该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

 1 package org.springframework.web.servlet;
 2 public interface HandlerInterceptor {
 3     boolean preHandle(
 4             HttpServletRequest request, HttpServletResponse response,
 5             Object handler)
 6             throws Exception;
 7
 8     void postHandle(
 9             HttpServletRequest request, HttpServletResponse response,
10             Object handler, ModelAndView modelAndView)
11             throws Exception;
12
13     void afterCompletion(
14             HttpServletRequest request, HttpServletResponse response,
15             Object handler, Exception ex)
16             throws Exception;
17 } 

写自己的拦截器:

 1 public class LoginInterceptor extends HandlerInterceptorAdapter {
 2     private List<String> excludedUrls;
 3     public void setExcludeUrls(List<String> excludeUrls) {
 4         this.excludedUrls = excludeUrls;
 5     }
 6     @Override
 7     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 8         String requestUri = request.getRequestURI();
 9         for (String url : excludedUrls) {
10             if (requestUri.endsWith(url)) {
11                 return true;
12             }
13         }
14         HttpSession session = request.getSession();
15         if (session.getAttribute("login")==null) {
16             throw new WebAuthException();
17         } else {
18             return true;
19         }
20     }
21 }

HandlerInterceptorAdapter是适配器模式的接口,这里允许我们只实现一个方法即可。excludedUrls中声明了不需要拦截的URL,如果访问的URL以指定字符串结尾,preHandle将返回true,他们将不被拦截而直接访问到对应的Controller。声明方式可以在Spring配置文件中,如下

 1     <mvc:interceptors>
 2         <mvc:interceptor>
 3             <mvc:mapping path="/*"/>
 4             <bean id="loginInterceptor" class="LoginInterceptor">
 5                 <property name="excludeUrls">
 6                     <list>
 7                         <value>/index</value>
 8
 9                         <value>/</value>
10                     </list>
11                 </property>
12             </bean>
13         </mvc:interceptor>
14     </mvc:interceptors>

也就是说“http://xxxxxxxxxx/index”,“http://xxxxxxxxxx/login”,“http://xxxxxxxxxx/”是不会被拦截的。

如果URL不以指定字符串结尾,那么将判断session中是否已经有登录信息(用户是否已经登录),如果登录了,正常跳转到Controller。如果没有登录则抛出异常。该异常是自定义的:

1 public class WebAuthException extends Exception {
2 }

然后再配置文件中指定,抛出异常时,重定向到登录页。

1     <bean id="handlerExceptionResolver"
2           class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
3         <property name="exceptionMappings">
4             <props>
5                 <prop key="com.thisone.apiserver.exception.WebAuthException">redirect:/index</prop>
6             </props>
7         </property>
8     </bean>

注意,如果没有redirect:,则直接跳转至名为index.jsp的页面。有redirect则会由Controller中@RequestMapping(value="/login")的方法来处理它。

1 @Controller
2 public class SystemController {
3     @RequestMapping(value = {"/index","/"},
4             method = RequestMethod.GET)
5     public String home() {
6         return "login";  //返回到login.jsp登录页,而不是Controller的方法。
7     }
8 }

 1     @RequestMapping(value = "/login",
 2             method = RequestMethod.POST)
 3     public String login(HttpServletRequest request,
 4                         @RequestParam String loginname,
 5                         @RequestParam String password) throws Exception {
 6         if (!loginname.equals("xxxx")) {
 7             request.getSession().setAttribute("loginReply", "用户名错误, 请重新登录");
 8             return "login";
 9         }
10         if (!password.equals("xxxx")) {
11             request.getSession().setAttribute("loginReply", "密码错误, 请重新登录");
12             return "login";
13         }
14         request.getSession().setAttribute("login", "yes");
15         return "welcome";
16     }

这样,用户只能通过/index,/,三个URL后缀来正常访问到页面,其他都是会重定向到/index,再有Cntroller方法引导至login.jsp。

参考:

Spring3 MVC Login
Interceptor(Spring 拦截器)

时间: 2024-08-04 17:18:27

【Spring MVC】Spring MVC,阻止直接访问jsp,使用Interceptor登录拦截的相关文章

【Spring学习笔记-MVC-14】Spring MVC对静态资源的访问

作者:ssslinppp       参考链接: http://www.cnblogs.com/luxh/archive/2013/03/14/2959207.html http://www.cnblogs.com/fangqi/archive/2012/10/28/2743108.html 优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往使用

Maven+Spring MVC Spring Mybatis配置

环境: Eclipse Neon 先决条件: Eclipse先用maven向导创建web工程.参见本站之前随笔. 本机安装完成mysql5:新建用户xuxy03设置为DB Manager角色:新建数据库genubi,新建一个示例表user_info_t.运行SQL: DROP TABLE IF EXISTS `user_info_t`; CREATE TABLE `user_info_t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` v

Spring、Spring MVC、MyBatis整合文件配置详解

使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Spring:http://spring.io/docs MyBatis:http://mybatis.github.io/mybatis-3/ 基本的组织结构和用法就不说了,前面的博客和官方文档上都非常的全面.jar包可以使用Maven来组织管理.来看配置文件. web.xml的配置                                           

Spring、Spring MVC、MyBatis

Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Spring:http://spring.io/docs MyBatis:http://mybatis.github.io/mybatis-3/ 基本的组织结构和用法就不说了,前面的博客和官方文档上都非常的全面.jar包可以使用Maven来组织管理.来看配置文件. web.xml的配置         

spring mvc+spring + hibernate 整合(三)

前面我们已整合了spring + hibernate,并建立了个用户的增加的实例,通过了单元测试,能正常增加数据.今天我们就来集成spring mvc以便建立web界面来输入数据并提交,后台再保存入库.关于spring mvc的一些基础理论及使用方法,网上有很多的资料,我这里就不多说了,下面我们进入实战.     因为我们项目会用到很多的图片.js代码.css样式文件等.我们在webapp目录下建立个static目录,统一对这些文件进行管理 一:web.xml配置 它提供了我们应用程序的配置设定

IDEA下创建Maven项目,并整合使用Spring、Spring MVC、Mybatis框架

项目创建 本项目使用的是IDEA 2016创建.项目使用Spring 4.2.6,Mybatis3.4.0,Tomcat使用的是Tomcat8,数据库为MySQL. 首先电脑安装Maven,接着打开IDEA新建一个project,选择Maven,选择图中所选项,下一步. 填写好GroupId和ArtifactId,GroupId在公司中一般都是域名的逆序,ArtifactId用来标明该项目是用来做什么的,接着下一步. 添加一个archetypeCatalog,值为internal可以加速项目的创

spring、spring mvc、mybatis框架整合基本知识

学习了一个多月的框架知识了,这两天很想将它整合一下.网上看了很多整合案例,基本都是基于Eclipse的,但现在外面公司基本都在用Intellij IDEA了,所以结合所学知识,自己做了个总结,有不足之处欢迎指正. 首先,我是参考了http://blog.csdn.net/zhshulin/article/details/37956105这篇做的Intellij IDEA翻版.Intellij IDEA的许多操作方式与习惯与eclipse区别很大,所以很容易走入误区.直接上操作吧. 1.基本概念

Spring MVC实现的登录拦截器

之前接触过struts拦截器,但是没有使用过Spring MVC拦截器,今天花了一天时间好好研究了一下. 定义拦截器 SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Sp

Spring MVC + Spring MongoDB + Querydsl 通过maven整合实例

效果图 一共3个页面:注册页,欢迎页,用户列表页 很简单的例子,主要是为了把流程走通,没有各种验证. 注册页: 欢迎页: 用户列表页: 源码地址 https://github.com/lemonbar/spring-framework-mongodb 参考文档 Spring framework: http://docs.spring.io/spring/docs/4.0.6.RELEASE/spring-framework-reference/htmlsingle/#spring-web Spr