SpringMVC 07: WEB-INF下的资源访问 + SpringMVC拦截器
WBE-INF目录下的资源访问
项目配置和Spring博客集(指SpringMVC 02)中配置一样
出于对网站资源的安全性保护,放在WBE-INF目录下的资源不可以被外部直接访问
在WEB-INF/jsp/下新建index.jsp和main.jsp,作为WEB-INF目录下的资源
部署并启动tomcat,根据2个资源的位置,尝试直接在地址栏访问
结果如下,两个资源均访问不到

- 修改springmvc.xml中视图解析器如下
<!-- 添加视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 配置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
- 新增控制器:WebInFAction,两个action方法分别转发请求WEB-INF下的相应资源
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class WebInfAction {
@RequestMapping("/showIndex")
public String showIndex(){
return "index";
}
@RequestMapping("/showMain")
public String showMain(){
return "main";
}
}
- 分别访问localhost:8080/showIndex.action和localhost:8080/showMain.action,成功访问WEB-INF下的资源

- 由于在web.xml中配置了接受处理的请求的格式"*.action",所以如果请求想要被处理必须以".action"结尾,修改该请求通配条件为"/",即对所有请求都接受处理
- 分别访问localhost:8080/showIndex和localhost:8080/showMain,去掉访问后缀后,也可以成功访问WEB-INF下的资源

- 虽然通过action转发比直接输入资源地址要安全一些,但是如果直接输入:localhost:8080/showMain也可以直接访问到WEB-INF下的资源,所以上述经action方法转发的方式其实也不安全。
- 我们尝试增加一个登陆验证,使得只有登陆成功的用户才可以访问到WEB-INF下的main.jsp资源
- webapp/index.jsp:点击超链接,向服务器请求登陆页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index.jsp</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/showLogin">去登陆</a>
</body>
</html>
- WEB-INF/jsp/新增login.jsp:作为登陆页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login.jsp</title>
</head>
<body>
<!-- 完成登陆信息的提交 -->
<h1>登陆</h1>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
<!-- 如果登陆失败,显示登陆失败信息-->
${msg}
</body>
</html>
- 控制器WebInfAction如下:新增登陆页面的转发功能,以及对登陆信息的验证判断功能
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class WebInfAction {
@RequestMapping("/showIndex")
public String showIndex(){
return "index";
}
@RequestMapping("/showMain")
public String showMain(){
return "main";
}
@RequestMapping("/showLogin")
public String showLogin(){
return "login";//转发并返回登陆页面
}
//对登陆信息进行判断,用户信息符合是转发跳转到main.jsp,信息不符合时,填入登陆失败的信息并重新转发到登陆页面
@RequestMapping("/login")
public String login(String username, String password, HttpServletRequest request){
if(username.equals("荷包蛋") && password.equals("hebaodan")){
return "main";
}else{
request.setAttribute("msg", "用户名或密码错误");
return "login";
}
}
}
- 部署并启动tomcat测试
- 当登陆信息错误时

- 当登陆信息正确时

- 但是如果直接访问:localhost:8080/showMain,仍然可以越过登陆,直接访问WEB-INF下的资源,仍然不安全
SpringMVC拦截器
- 拦截器执行原理

拦截器的作用:
针对请求和响应进行额外的处理,在请求和响应的过程中添加预处理,后处理和最终处理
拦截器执行的时机:
preHandle():在请求被处理之前进行操作,即预处理
postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果,即后处理
afterCompletion:所有的请求响应结束后执行善后工作,清理对象,关闭资源,即最终处理
拦截器实现的两种方式:
继承HandlerInterceptorAdapter父类
或者实现HandlerInterceptor接口(推荐使用接口方式:java遵循单继承,不要轻易的去继承那些非核心业务的父类,否则就无法再继承其他业务类了,对于某些附加功能,去实现相应接口就可以了,因为允许实现很多接口)
拦截器的实现步骤:
改造登陆方法,在session中存储用户信息,用于进行权限验证
开发拦截器的功能,实现HandlerInterceptor接口,重写preHandle()方法,进行登陆信息验证
在springmvc.xml文件中注册拦截器
使用拦截器继续改造上述WEB-INF下资源的安全访问:
WebInfAction中的login方法修改如下:登陆成功后,向session域中存放用户信息,用于后续安全验证
@RequestMapping("/login")
public String login(String username, String password, HttpServletRequest request){
if(username.equals("荷包蛋") && password.equals("hebaodan")){
//如果登陆成功,则设置session信息
request.getSession().setAttribute("user", username);
return "main";
}else{
request.setAttribute("msg", "用户名或密码错误");
return "login";
}
}
- 新增登陆拦截器
package com.example.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 登陆拦截器
*/
public class LoginInterceptor implements HandlerInterceptor {
//预处理拦截
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//验证session信息,判断是否登陆成功
if(request.getSession().getAttribute("user") == null){
request.setAttribute("msg", "还未登陆,清先登陆");
//打回登陆页面(页面转发实现页面跳转)
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false;//验证信息未通过
}
return true;//验证信息通过,放行
}
}
- 在springmvc.xml中新增对拦截器的注册
<!-- 配置SpringMVC拦截器-->
<mvc:interceptors>
<!-- 可以配置多个拦截规则,形成拦截链-->
<mvn:interceptor>
<!-- 映射要拦截的请求:所有请求-->
<mvn:mapping path="/**"/>
<!-- 设置要放行的请求:有些必备的登陆请求不能拦截-->
<mvn:exclude-mapping path="/showLogin"/>
<mvn:exclude-mapping path="/login"/>
<!-- 配置实现拦截器功能的实现类-->
<bean class="com.example.interceptor.LoginInterceptor"/>
</mvn:interceptor>
</mvc:interceptors>
- 部署并启动tomcat测试
- 当越过登陆直接访问WEB-INF下的资源时,未能通过验证,被打回登陆页面

- 登陆成功后,新建窗口,直接访问,此时session域中信息还未过期,成功通过验证

SpringMVC 07: WEB-INF下的资源访问 + SpringMVC拦截器的更多相关文章
- 读取web应用下的资源文件(例如properties)
package gz.itcast.b_resource; import java.io.IOException; import java.io.InputStream; import java.ut ...
- SpringBoot 2.x 自定义拦截器并解决静态资源访问被拦截问题
自定义拦截器 /** * UserSecurityInterceptor * Created with IntelliJ IDEA. * Author: yangyongkang * Date: ...
- SpringMVC的文件上传下载,异常处理,拦截器的小总结
文件的上传和下载 我们通常在访问网页时会使用到文件的上传与下载的功能,那么他是如何实现的呢? 1 下载: ResponseEntity :用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览 ...
- Windows Server 2008下共享资源访问走捷径 (不用用户名 和 密码 访问共享)
1. 启用来宾帐号2. 共享目录添加“Guest”帐号3. “gpedit.msc”,打开对应系统的组策略编辑窗口;在该编辑窗口的左侧显示区域,依次展开“本地计算机策略”/“计算机配置”/“Windo ...
- 启动web项目,监听器、过滤器、拦截器启动顺序
启动顺序:监听器 > 过滤器 > 拦截器 记忆技巧:接到命令,监听电报,过滤敌情,拦截行动.
- 【SpringMVC】静态资源访问的问题
在项目中经常会用到一些静态的资源,而一般我们在配置SpringMVC时会让SpringMVC接管所有的请求(包括静态资源的访问), 那么我们怎样才能最简单的来配置静态资源的访问呢? 一,在web.xm ...
- springMVC静态资源访问
springMVC默认是访问不到静态资源的,如css,js等,需要在xml里进行配置 保证已经配置好了 web.xml, <!-- Spring MVC servlet --> <s ...
- Spring 详解(三)------- SpringMVC拦截器使用
目录 不拦截静态资源 使用拦截器 拦截器使用测试 SimpleMappingExceptionResolver 拦截异常 不拦截静态资源 如果配置拦截类似于*.do格式的拦截规则,则对静态资源的访问是 ...
- Web Service学习之七:CXF拦截器
一.用途 CXF拦截器类似Struts2的拦截器,后者是拦截和处理请求,前者是对发送和接收的sope消息进行处理,一般用于WS请求响应中的权限验证.日志记录,Soap消息处理,消息的压缩处理等: 这个 ...
随机推荐
- 重学ES系列之模版字符串
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 分享一款IDEA主题,很奈斯
主题名称:Dark Purple Theme: 更换主题:在Setting中设置更换
- 深入理解 Java 对象的内存布局
对于 Java 虚拟机,我们都知道其内存区域划分成:堆.方法区.虚拟机栈等区域.但一个对象在 Java 虚拟机中是怎样存储的,相信很少人会比较清楚地了解.Java 对象在 JVM 中的内存布局,是我们 ...
- AI 企业多云存储架构实践 | 深势科技分享
2020 年末,谷歌旗下 DeepMind 研发的 AI 程序 AlphaFold2 在国际蛋白质结构预测竞赛上取得惊人的准确度,使得" AI 预测蛋白质结构"这一领域受到了空前的 ...
- SpringBoot接口 - 如何优雅的写Controller并统一异常处理?
SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?@pdai 为什么要优雅的处理异常 如果我们不统一的处理异常,经 ...
- 关于 Python 的 import
好久以前就被 Python 的相对与绝对导入所困扰.去年粗浅探究后自以为完全理解,近来又因 sys.path[0] 和 os.getcwd() 的不一致而刷新了认知... Python 官方文档 5. ...
- C++对象的应用
本篇文章将介绍对象数组,对象的动态分配以及对象在函数中的应用. 一.对象数组 1.对象数组的定义和初始化 定义对象数组与定义普通数组的语法形式基本相同.如定义一个Square obj[3]:表示一个正 ...
- 图扑 Web 可视化引擎在仿真分析领域的应用
前言 在数字孪生和仿真研究过程中,会产生大量和三维空间相关的数值信息,比如设备外观的扫描数据.地形扫描数据.生产设备温度场/压力场.流体的速度场.流体扩散,以及各种仿真数据:速度,压力,应力,温度 ...
- ooday04 Java_面向对象_重写_static
方法的重写(override/overriding):重新写.覆盖 发生在父子类中,方法名相同,参数列表相同 重写方法被调用时,看对象的类型------------这是规定,记住就OK 当派生类觉得超 ...
- grafana监控配置
一.配置开启smtp服务 1.编辑grafana配置文件grafana.ini [smtp] enabled = true host = smtp.163.com:25 user = 157xxxx3 ...