SpringMVC之拦截器实现登录验证
今天回头看之前发的javaweb学习路线图,发现把路线图中的也学的有一半多了,不过还是路漫漫。在前面的博客中有学习过spring的aop,它利用动态代理实现,在springmvc中也是一样,今天使用HandlerInterceptor来实现登录权限验证。我们平时在做系统时有些页面是需要先登录才能访问的,一种方法是在每个请求方法中都做登录判断,这样顶多是把登录功能封装起来,以后没新增一个代码都要加上,这样很不方便。其实这里我们可以使用拦截器进行登录验证,判断是否有session,如果有session就断定已经登录。拦截器不仅仅可以做登录,它做登录完成之后可能还有根据用户角色限制页面或工具的权限,我们还可以再增加一个拦截器,来判断用户权限等。还可以使用它做防盗链,这个防盗链的之前博客中也有类似的实现,今天就只演示下登录。
一、创建控制器
1.这里创建了LoginIntercepter类实现HandlerInterceptor来创建控制器.HandlerInterceptor它有3个方法,preHandle,postHandle,afterCompletion,3个方法在之前学习springmvc工作流程的时候也有介绍。我们做登录验证主要是在preHandle方法中来做校验。这里判断是不是登录页面,登录页面不能被拦截,不然它始终登录不上.然后判断是否有session,如果有则当做登录成功,没有则跳转到登录页面.
package com.cyw.web.Intercepter; 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; public class LoginIntercepter implements HandlerInterceptor{ @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
String requestURI = request.getRequestURI();
if(requestURI.indexOf("/login")<=0){
//说明处在编辑的页面
HttpSession session = request.getSession();
String username = (String) session.getAttribute("username");
if(username!=null){
//登陆成功的用户
return true;
}else{
//没有登陆,转向登陆界面
request.getRequestDispatcher("../view/Login.jsp").forward(request,response);
// response.sendRedirect("../login/login.action"); return false;
}
}else{
return true;
}
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
} @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
} }
2.拦截器配置 在spring-mvc.xml中进行配置
<mvc:interceptors>
<mvc:interceptor><mvc:mapping path="/**"/><bean class="com.cyw.web.Intercepter.LoginIntercepter"/></mvc:interceptor>
<mvc:interceptor><mvc:mapping path="/**"/><bean class="com.cyw.web.Intercepter.LoginWebRequestInterceptor"/></mvc:interceptor>
</mvc:interceptors>
这里配置了两个拦截器,LoginWebRequestInterceptor这个也是一拦截器.
二、创建jsp页面
这里创建了一个login.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>Insert title here</title>
</head>
<body>
<form action="../login/login.action" method="post">
姓名:<input type="text" name="username"> <br><br>
密码: <input type="text" name="password"> <br><br>
<input type="submit" value="登陆">
</form>
</body>
</html>
三、创建LoginController
这里创建了LoginController用来接收登录的post请求.
package com.cyw.web.controller; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView; @Controller
@RequestMapping("/login")
public class LoginController {
@RequestMapping(value = "/login.action",method = RequestMethod.GET)
public ModelAndView login(HttpServletRequest request,HttpServletResponse response){
ModelAndView modelAndView = new ModelAndView("Login");
return modelAndView;
}
@RequestMapping(value = "login.action",method = RequestMethod.POST)
public String clientLogin(HttpServletRequest request,HttpServletResponse response){
String username=request.getParameter("username");
String password=request.getParameter("password");
if(username.equals("cuiyw")&&password.equals("123456")){
//登陆成功
request.getSession().setAttribute("username",username);
return "forward:/hello/testModelAndView";
}else{
//登陆失败
return "forward:/login/login.action";
}
} }
但是上面的代码就会出现问题HTTP Status 405 – Method Not Allowed ,Request method 'POST' not supported。

为什么会出现这个错误呢?我开始以为是LoginController中的@RequestMapping配置有问题,但找了好久也没找到,而且再次输入页面时显示的是登录成功的,意思是session也是设置上的,抱着尝试的心态把return中的forward改成redirect,没想到成功了。这就尴尬了,这就涉及到forward与redirect的区别。
四、forward与redirect的区别
forward过程
转发,服务器端行为。web服务器把接受的请求,调用内部的方法在容器内部完成请求处理和转发动作,然后响应客户端,在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。
redirect过程
重定向,客户端行为。客户端发送http请求,web服务器接受后发送3**状态码响应及对应新的location给客客户端,客户端发现是3**响应,则自动再发送一个新的http请求,请求url是新的location地址,在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。重定向行为是浏览器做了至少两次的访问请求。
五、问题原因
上面的forward与redirect的区别也有介绍它们两个的区别,forward用的还是同一个请求,只是把这个请求转给另一个方法处理,redirect是响应给客户端3开头的状态码,然后客户端再次请求,这里我们登录的是post请求,而/hello/testModelAndView对应的testModelAndView方法设置的method = RequestMethod.GET,就没有post,所以报405的错误。
六、WebRequestInterceptor拦截器
springmvc中还可以使用WebRequestInterceptor来做拦截器,用法和HandlerInterceptor差不多,也是现实WebRequestInterceptor,然后重写父类的方法,配置到spring-mvc.xml中。实现的方法名是一样的,只是HandlerInterceptor中使用的HttpServletRequest,WebRequestInterceptor中使用的是WebRequest.
七.小结
其实原本不打算写拦截器呢,因为springmvc的参数传递还没写完,所以下篇还是要接着写参数传递,json与Controller的交互.
SpringMVC之拦截器实现登录验证的更多相关文章
- SSM项目使用拦截器实现登录验证功能
SSM项目使用拦截器实现登录验证功能 登录接口实现 public User queryUser(String UserName, String Password,HttpServletRequest ...
- SpringMVC配置拦截器实现登录控制
SpringMVC读取Cookie判断用户是否登录,对每一个action都要进行判断.之前使用jstl标签在页面上判断session如果没有登录就使用如下代码跳转到登录页面. <c:if tes ...
- 基于SSH2框架Struts2拦截器的登录验证实现(转)
大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证. 修改数 ...
- springmvc拦截器实现登录验证
首先创建一个实体类: Customer: 1 package com.petcare.pojo.base; 2 3 import java.sql.Date; 4 import java.sql.Ti ...
- springmvc 自定义拦截器实现未登录用户的拦截
第一步:编写自定义拦截器类,该类继承HandlerInterceptorAdapter,重写preHandle方法 第二步:配置springmvc.xml文件,定义拦截器属性 登录请求的mappi ...
- springboot+springmvc拦截器做登录拦截
springboot+springmvc拦截器做登录拦截 LoginInterceptor 实现 HandlerInterceptor 接口,自定义拦截器处理方法 LoginConfiguration ...
- SpringMVC利用拦截器防止SQL注入
引言 随着互联网的发展,人们在享受互联网带来的便捷的服务的时候,也面临着个人的隐私泄漏的问题.小到一个拥有用户系统的小型论坛,大到各个大型的银行机构,互联网安全问题都显得格外重要.而这些网站的背后,则 ...
- SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】
注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处.假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...
- springMVC配置拦截器、过滤器、前端控制器时遇到的问题总结
1.业务场景:使用vuejs+springMVC+spring框架搭建一个mis系统,集成SSO单点登录: 2.遇到问题:使用interceptor拦截器配置SSO单点登录,直接敲域名,或者ip+端口 ...
随机推荐
- php程序报错:PHP Core Warning/cannot open shared object file: No such file or directory
今天开发调试程序的时候报错了,现象是有时候刷新会出现如下图: 这种主要是找不到共享库文件,即.so文件,网上主要有3种解决方法: 1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默 ...
- TR069网管协议应用在Android系统开发的前言
随着智能平台的终端设备不断发展,迫切需要我们解决这些终端的管理问题,而现有的终端统一管理平台已经成熟,主要是基于tr069协议网管平台,比如华为的itms等终端管理平台.所以,这篇文章就是为了实现一种 ...
- Spark:reduceByKey函数的用法
reduceByKey函数API: def reduceByKey(partitioner: Partitioner, func: JFunction2[V, V, V]): JavaPairRDD[ ...
- POJ-1679 The Unique MST---判断最小生成树是否唯一
题目链接: https://vjudge.net/problem/POJ-1679 题目大意: 给定一个无向连通网,判断最小生成树是否唯一. 思路: (1)对图中的每条边,扫描其他边,如果存在相同权值 ...
- property()函数
class C: def __init__(self, size=10): self.size = size def getXSize(self): return self.size def setX ...
- Git Bash
Git Bash是Git的命令行工具,可以执行Git的所有命令,但是当我们想把一个URL粘贴到Git Blash时,Ctrl+V或者右键粘贴不起作用了 方法1-使用快捷键"Insert&qu ...
- jacascript 构造函数、原型对象和原型链
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 先梳理一下定义: 我们通常认为 object 是普通对象,function 是函数对象: Function ...
- [bzoj 1293] [SCOI2009] 生日礼物
传送门(bzoj) 传送门(luogu) 题目: Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应 ...
- Oracle服务启动项
七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service: Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基 ...
- [LeetCode] 4 Keys Keyboard 四键的键盘
Imagine you have a special keyboard with the following keys: Key 1: (A): Print one 'A' on screen. Ke ...