当前位置:首页 > 后端开发 > SpringMVC之拦截器实现登录验证

SpringMVC之拦截器实现登录验证

7个月前 (05-26)54

今天回头看之前发的javaweb学习路线图,发现把路线图中的也学的有一半多了,不过还是路漫漫。在前面的博客中有学习过spring的aop,它利用动态代理实现,在springmvc中也是一样,今天使用HandlerInterceptor来实现登录权限验证。我们平时在做系统时有些页面是需要先登录才能访问的,一种方法是在每个请求方法中都做登录判断,这样顶多是把登录功能封装起来,以后没新增一个代码都要加上,这样很不方便。其实这里我们可以使用拦截器进行登录验证,判断是否有session,如果有session就断定已经登录。拦截器不仅仅可以做登录,它做登录完成之后可能还有根据用户角色限制页面或工具的权限,我们还可以再增加一个拦截器,来判断用户权限等。还可以使用它做防盗链,这个防盗链的之前博客中也有类似的实现,今天就只演示下登录。

一、创建控制器

1.这里创建了LoginIntercepter类实现HandlerInterceptor来创建控制器.HandlerInterceptor它有3个方法,preHandle,postHandle,afterCompletion,3个方法在之前学习springmvc工作流程的时候也有介绍。我们做登录验证主要是在preHandle方法中来做校验。这里判断是不是登录页面,登录页面不能被拦截,不然它始终登录不上.然后判断是否有session,如果有则当做登录成功,没有则跳转到登录页面.

SpringMVC之拦截器实现登录验证 _ Java侠
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);
    }

}
View Code

2.拦截器配置 在spring-mvc.xml中进行配置

SpringMVC之拦截器实现登录验证 _ Java侠
    <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> 
View Code

这里配置了两个拦截器,LoginWebRequestInterceptor这个也是一拦截器.

二、创建jsp页面

这里创建了一个login.jsp的登录页面.

SpringMVC之拦截器实现登录验证 _ Java侠
<%@ 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>
View Code

三、创建LoginController

这里创建了LoginController用来接收登录的post请求.

SpringMVC之拦截器实现登录验证 _ Java侠
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";  
        }  
    } 

}
View Code

但是上面的代码就会出现问题HTTP Status 405 – Method Not Allowed ,Request method 'POST' not supported。

SpringMVC之拦截器实现登录验证 _ Java侠

为什么会出现这个错误呢?我开始以为是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的交互.

作者:社会主义接班人
来源链接:https://www.cnblogs.com/5ishare/p/8972267.html

标签: SpringMVC

“SpringMVC之拦截器实现登录验证” 的相关文章

SpringMVC跨域文件上传

SpringMVC跨域文件上传

文章目录 1.SpringMVC跨域文件上传 1.tomcat配置允许tomc...

SpringMVC添加对象转换成json

SpringMVC添加对象转换成json

0,问题      1,分析     SpringMVC默认没有将对象转换成json数据格式的,...

一、springMVC、freemarker页面半自动静态化

一、springMVC、freemarker页面半自动静态化

说明:刚刚接到公司的通知,实现(半自动化),即通过参数控制是否需要静态化页面(哪里我说错了,勿喷!谢谢)    1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm...

SpringMVC-快速入门(一)

SpringMVC-快速入门(一)

概述 在 Web 项目中使用 Spring 框架,首先要解决在 Web 层(Servlet)中获取到 Spring 容器的问题。只要在 Web...

基础框架 SpringMVC详解

基础框架 SpringMVC详解

基础框架 SpringMVC详解 一、SpringMVC基本概念 1.三层架构 开发常用的两种架构形式: 1.一种是 C/S 架构...

springmvc之Profile

springmvc之Profile

Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能。 @Profile(“test”):指定生效环境。默认是default环境。 切换环境...

SpringMVC获取请求参数乱码问题

SpringMVC获取请求参数乱码问题

使用配置:jdk18           ...

SpringMVC注解启用

本文是我在学习网络视频SpringMVC的过程中写下的。感谢发布视频的各位前辈 下面讲解SpringMVC注解启用的几个关键步骤: 首先需要加载配置文件(如果使用...

SpringMVC、Zookeeper、Dubbo使用

SpringMVC、Zookeeper、Dubbo使用

互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的。现在核心业务抽取...

SpringMVC配置和基本原理

SpringMVC配置和基本原理

目录 第一章:Java web的发展历史 一.Model I和Model II 1.Model I开发模式 2.Model II开发模式 二....