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消息处理,消息的压缩处理等: 这个 ...
随机推荐
- 封装环形加载进度条(Vue插件版和原生js版)
1.效果预览 2.用到的知识 主要利用SVG的stroke-dasharray和stroke-dashoffset这两个属性. 在看下面文章之前,你需要了解 <!DOCTYPE html> ...
- Android (微信扫码登录) 获取微信二维码+扫码登录
话不多说 直接上菜! 一.因为是微信扫码登录,所有要在微信开放平台 微信开放平台 (qq.com) 进行注册----- 如下 1.资源中心 里面也有详细的官方讲解,里面也有demo 可以下载 2 ...
- sql-DML-增删改
DML:增删改表中数据 1. 添加数据: insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n); insert into 表名 values(值1,值2 ...
- 用python进行加密和解密——我看刑
加密和解密 密码术意味着更改消息的文本,以便不知道你秘密的人永远不会理解你的消息. 下面就来创建一个GUI应用程序,使用Python进行加密和解密. 在这里,我们需要编写使用无限循环的代码,代码将不断 ...
- java反序列化漏洞专项
背景条件:java的框架,java的应用程序,使用序列化,反序列化操作非常多.在漏洞挖掘中,代码审计中,安全研究中,反序列化漏洞是个重点项,不可忽视.尤其是java应用程序的rce,10个里面有7个是 ...
- 记一次requests请求乱码的问题
太懒了,直接说原因吧: 请求返回的内容含有emoji表情 我的解决办法是替换掉emoji字符: 安装库:pip install emoji 替换:emoji.demojize(CONTENT) 注意, ...
- java自定义注解实现执行所有要测试的接口
/* * 注解类 * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Demo ...
- APISpace 周公解梦API接口 免费好用
<周公解梦>,是根据人的梦来卜吉凶的一本解梦书籍,它对人的七类梦境进行解述. 周公解梦API,周公解梦大全,周公解梦查询,免费周公解梦. APISpace 有很多免费通用的API接 ...
- DNS原理与配置
DNS介绍 域名管理系统DNS(Domain Name System)是域名解析服务器的意思,应用层协议,是互联网的一项服务. DNS作用是: 把域名转换成网络可以识别的ip地址,在通过IP地址访问主 ...
- jdbc 09: preparedStatement实现增删改查
jdbc连接mysql,利用preparedStatement实现增删改查 package com.examples.jdbc.o9_preparedStatement实现增删改; import ja ...