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拦截器的更多相关文章

  1. 读取web应用下的资源文件(例如properties)

    package gz.itcast.b_resource; import java.io.IOException; import java.io.InputStream; import java.ut ...

  2. SpringBoot 2.x 自定义拦截器并解决静态资源访问被拦截问题

      自定义拦截器 /** * UserSecurityInterceptor * Created with IntelliJ IDEA. * Author: yangyongkang * Date: ...

  3. SpringMVC的文件上传下载,异常处理,拦截器的小总结

    文件的上传和下载 我们通常在访问网页时会使用到文件的上传与下载的功能,那么他是如何实现的呢? 1 下载: ResponseEntity :用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览 ...

  4. Windows Server 2008下共享资源访问走捷径 (不用用户名 和 密码 访问共享)

    1. 启用来宾帐号2. 共享目录添加“Guest”帐号3. “gpedit.msc”,打开对应系统的组策略编辑窗口;在该编辑窗口的左侧显示区域,依次展开“本地计算机策略”/“计算机配置”/“Windo ...

  5. 启动web项目,监听器、过滤器、拦截器启动顺序

    启动顺序:监听器 > 过滤器 > 拦截器 记忆技巧:接到命令,监听电报,过滤敌情,拦截行动.

  6. 【SpringMVC】静态资源访问的问题

    在项目中经常会用到一些静态的资源,而一般我们在配置SpringMVC时会让SpringMVC接管所有的请求(包括静态资源的访问), 那么我们怎样才能最简单的来配置静态资源的访问呢? 一,在web.xm ...

  7. springMVC静态资源访问

    springMVC默认是访问不到静态资源的,如css,js等,需要在xml里进行配置 保证已经配置好了 web.xml, <!-- Spring MVC servlet --> <s ...

  8. Spring 详解(三)------- SpringMVC拦截器使用

    目录 不拦截静态资源 使用拦截器 拦截器使用测试 SimpleMappingExceptionResolver 拦截异常 不拦截静态资源 如果配置拦截类似于*.do格式的拦截规则,则对静态资源的访问是 ...

  9. Web Service学习之七:CXF拦截器

    一.用途 CXF拦截器类似Struts2的拦截器,后者是拦截和处理请求,前者是对发送和接收的sope消息进行处理,一般用于WS请求响应中的权限验证.日志记录,Soap消息处理,消息的压缩处理等: 这个 ...

随机推荐

  1. 从开发一款基于Vue技术栈的全栈热重载生产环境脚手架,我学到了什么

    浏览文章前 这一期,我分享给大家三点看源码的小技巧,这也是从别的大佬那总结的. 被反复使用的代码 这样的代码是一个软件的重点函数,一个大神的写法有很多精华值得学习. 穿越时间的代码 如果一段代码10年 ...

  2. SAP 查看在线用户

    SM04 可查看服务器全部客户端(Client)的用户的在线状态,并可以结束指定用户的会话状态,也就是强制踢出用户.

  3. Windows下MySQL的安装和删除

    Windows下MySQL的安装和删除 安装Mysql 1 下载mysql 地址 2 安装教程 2.1配置环境变量 变量名:MYSQL_HOME 变量值:D:\software\programming ...

  4. Linux 文件权限相关知识

    文件权限说明 Linux中的文件能否被访问和工具(程序)无关,和访问的用户身份有关(谁去运行这个程序) 进程的发起者(谁去运行这个程序). 进程的发起者若是文件的所有者: 拥有文件的属主权限 进程的发 ...

  5. 解决方案:可以ping别人,但是别人不能ping我

    背景:我在写分布式爬虫项目时遇到了slave端无法ping通我的master,我的master可以ping通slave.我将master的防火墙关闭后slave可以ping了,但是这不是解决办法.于是 ...

  6. 程序分析与优化 - 9 附录 XLA的缓冲区指派

    本章是系列文章的案例学习,不属于正篇,主要介绍了TensorFlow引入的XLA的优化算法.XLA也有很多局限性,XLA更多的是进行合并,但有时候如果参数特别多的场景下,也需要进行分割.XLA没有数据 ...

  7. Elasticsearch学习系列七(Es分布式集群)

    核心概念 集群(Cluster) 一个Es集群由多个节点(Node)组成,每个集群都有一个共同的集群名称作为标识 节点(Node) 一个Es实例就是一个Node.Es的配置文件中可以通过node.ma ...

  8. poste.io自建邮件服务器

    随便说些什么 腾讯企业邮新增账号不方便,这里的主要是指不经过手机验证或微信扫码的,虽然提供了最多3个"业务邮箱",很明显不够用. EwoMail,装没装起来我不记得了,反正是不好用 ...

  9. highcharts图表及报表展示、导出数据

    @ 目录 前言 一.使用highcharts前后端交互展示图表,及使用报表导出 二.实现思路 1.图表可以选择echarts.highcharts,我们这里选择highcharts(echarts使用 ...

  10. 典型相关分析CCA计算过程

      本文介绍了CCA解决的问题,CCA原理的推导过程,以及对计算结果物理意义的解释.并且通过SPSS和R操作演示了一个关于CCA的例子.数据文件下载参考[8],SPSS输出结果文件下载参考[9],R代 ...