springmvc * 登录验证示例
作者:书剑江山 发布时间:2022-11-28 12:15:24
一开始,学了 * 与过滤器,咋一看两者有点像,实际上两者有很大的不同。就用 * 和过滤器分别做了登录验证试验,这次先说 * 。下面是自己实践的一个实例:
在spring-mvc.xml中配置 * :
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/*"/>
<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
<bean class="com.wyb.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
如上所示,这里配置了LoginIntercepter,为了简单起见,该过滤器只拦截了URL为"/user/*"的请求。
要拦截的请求对应控制器如下:
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.wyb.domain.User;
import com.wyb.service.IUserService;
import com.wyb.service.impl.UserServiceImpl;
@Controller
@RequestMapping("/user")
public class UserController {
private static final Logger LOG=Logger.getLogger(UserController.class);
@Autowired
private IUserService userService;
@RequestMapping("/showAllUser")
public String showAllUser(Model m){
List<User> userlist=new ArrayList<User>();
userlist=userService.findAllUser();
for(User user :userlist){
System.out.println(user.getUserName());
}
return "/jsp/showAllUser";
}
}
这里的showAllUser()方法是为了输出所有的用户,为了表明执行了方法,将所有用户在后台打印,URL为:http://localhost:8080/TestSSM/user/showAllUser,可见该URL肯定会被LoginIntercepter拦截。
测试页面showAllUser.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>show All User</title>
</head>
<body>
this is showAllUser Page!!!
</body>
</html>
LoginIntercepter如下:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.wyb.domain.User;
public class LoginInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("this is afterCompletion of LoginInterceptor");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("this is postHandle of LoginInterceptor");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("this is preHandle of LoginInterceptor");
HttpSession session=request.getSession();
User user=(User)session.getAttribute("user");
if(user==null){
System.out.println("no user in LoginInterceptor!!!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
}
//返回true代表继续往下执行
return true;
}
}
这里我犯了一个错误,聪明的小伙伴也许已经看出来了,如果按照上面的代码,当我们访问:http://localhost:8080/TestSSM/user/showAllUser结果如下:
咋一看,成功拦截了,输入用户名信息,正常跳转到主页,再次进入http://localhost:8080/TestSSM/user/showAllUser如下:
页面正常输出,已经记录了session,不会被再次拦截,看似成功了,可是看看后台输出:
有没有发现,我们执行了两次showAllUser()方法,可见第一次访问虽然被 * 拦截了下来进入登录页面,但后台已经悄悄执行了showAllUser()。为什么呢?我们回头再看看LoginIntercepter.java,尤其是preHandle()方法:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("this is preHandle of LoginInterceptor");
HttpSession session=request.getSession();
User user=(User)session.getAttribute("user");
if(user==null){
System.out.println("no user in LoginInterceptor!!!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
}
//返回true代表继续往下执行
return true;
}
在判断user为空后,虽然执行了页面跳转,但是程序还是会继续执行,最后返回true,返回true意味着,被拦截的业务逻辑可以继续往下执行,因此,虽然表面上被拦截了,但从本质上来说并没有拦截到。因此需要修改如下:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("this is preHandle of LoginInterceptor");
HttpSession session=request.getSession();
User user=(User)session.getAttribute("user");
if(user==null){
System.out.println("no user in LoginInterceptor!!!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
//本次访问被拦截,业务逻辑不继续执行
return false;
}
//返回true代表继续往下执行
return true;
}
user为空,跳转后,返回false,就不会执行被拦截的业务逻辑了,修改后后台输出如下:
现在后台正常输出,且session保存了user信息后,才能执行showAllUser()方法,大功告成!
来源:http://www.cnblogs.com/wangYB/articles/6419944.html
猜你喜欢
- 本文实例为大家分享了Java简单实现定时器的具体代码,供大家参考,具体内容如下一、定时器定时器相当于一个任务管理器。有些任务可能现在执行,
- C#版本public static Component AddComponent(GameObject go, string assembl
- 1.SpringBoot AOP功能1.1 LTW与不同的切面织入时机AOP——面向切面编程,通过为
- for循环和foreach循环其实可以算得上是从属关系的,即foreach循环是可以转化成for循环,但是for循环不一定能转换成forea
- 今天给大家介绍一下Java实现钢琴的小程序,程序虽小,功能挺多,支持循环播放,录音等功能,首先简单介绍下源码结构:先看看钢琴界面实现,添加相
- 在开发中经常使用到Set集合去重,那么去重的原理是怎样实现的呢?在此文章记录一下去重原理!!!下面是set集合类图下面我们来跟踪一下执行过程
- Maven打包没有指定主类在使用IDEA开发项目的时候经常会遇到使用Maven打包项目(打成jar包或者zip包),但是之前不太清楚打包插件
- 本文实例讲述了java实现简单的英文文本单词翻译器功能。分享给大家供大家参考,具体如下:直接上代码:package fanyi;import
- 很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理使用java8新特性,下面先来点基础的Lis
- 一、引言Good Good Study,Day Day UpMP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么
- 1. 为什么使用线程池诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小
- 大致流程客户端根据远程服务的地址,客户端发送请求至服务端,服务端解析信息并找到对应的实现类,进行方法调用,之后将调用结果原路返回,客户端解析
- Filter过滤器中访问getSession()要进行转化public void doFilter(ServletRequest reque
- 因为项目需要,需要在一个之前没做过springBoot项目的eclipse上跑一个springBoot项目并完成打包,所以就在网上查完资料以
- 本文实例讲述了C#多线程学习之生产者和消费者用法。分享给大家供大家参考。具体实分析如下:前面的文章说过,每个线程都有自己的资源,但是代码区是
- 本文作者:Spring_ZYL文章来源:https://blog.csdn.net/gozhuyinglong版权声明:本文版权归作者所有,
- 在application.xml加上以下配置mybatis-plus.configuration.map-underscore-to-cam
- Spring cloud网关gateway进行websocket路由转发规则配置一、websocket及http路由转发规则配置后端是普通的
- 背景某项目,客户要求使用已有的 weblogic 部署已经开发好的 springboot,于是乎对 springboot 进行了部分配置的调
- 线程池的好处可以实现线程的复用,避免重新创建线程和销毁线程。创建线程和销毁线程对CPU的开销是很大的。可以限制最大可创建的线程数,可根据自己