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消息处理,消息的压缩处理等: 这个 ...
随机推荐
- 【Github】 Github修改仓库的基本信息
前言 我们通常在刚开始了解学习使用github时,一般都是测试的使用,有时我们向里面添加了一些代买,如果想要修改信息并且是删除仓库重新创建提交,可以采用下面方法修改仓库信息,名称.描述等. 修改仓库描 ...
- 基于JavaFX图形界面演示的迷宫创建与路径寻找
事情的起因是收到了一位网友的请求,他的java课设需要设计实现迷宫相关的程序--如标题概括. 我这边不方便透露相关信息,就只把任务要求写出来. 演示视频指路: 视频过审后就更新链接 完整代码链接: 网 ...
- java web 三层架构设计
界面层(表示层):用户看得到的,可以通过此与服务器交互 业务逻辑层:处理业务逻辑. 数据访问层:操作数据存储文件
- IDEA快速创建maven项目
遇到问题不要急,不要怕. 一. 二. 三. 四.Finish进来之后,项目会加载一会,之后会是下面这样子. 五.继续往下面配置,建立java和resorces文件夹 六.下面配置tomcat服 ...
- Linux 安装Apche服务
用yum 进行在线安装apche服务 yum install -y httpd 我这边是centos7 需要开启一下端口: 1 firewall-cmd --zone=public --add-por ...
- # NC20860 兔子的区间密码
NC20860 兔子的区间密码 题目 题目描述 有一只可爱的兔子被困在了密室了,密室里有两个数字,还有一行字: 只有解开密码,才能够出去. 可爱的兔子摸索了好久,发现密室里的两个数字是表示的是一个区间 ...
- .NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查)
一.引言 上一篇.NET ORM框架HiSql实战-第一章-集成HiSql 已经完成了Hisql的引入,本节就把 项目中的菜单管理改成hisql的方式实现. 菜单管理界面如图: 二.修改增删改查相关代 ...
- mt19937 用法
老是忘记怎么用,自己写一个用作备忘录吧. 首先需要的头文件: #include <random> 或者是 #include <bits/stdc++.h> //万能头 yyds ...
- JavaWeb连接MySQL数据库
JavaWeb连接MySQL数据库 JavaWeb连接MySQL数据库的方式有很多,首先我们讲解JDBC的配置方法 一.JDBC的配置方法 1.什么是JDBC 什么是JDBC嘞?JDBC代表Java数 ...
- USB转串口参数配置功能
当使用USB转串口芯片时,在部分场合下需要修改芯片内部的USB参数以满足其应用需要.常见如: 系统下使用多个USB转串口芯片,区分使用各芯片. 修改厂商ID.产品ID.厂商字符串,使用客户自有ID和信 ...