SSM 拦截器验证权限和登录与注销的实现
拦截器的作用在于,比如我们输入 xxx.com/admin 发起请求进入 网站后台或者其他后台页面。我们的拦截器会在 Controller 调用之前进行拦截,至于什么拦截,由我们来写。比如,判断用户是否登录(可以通过 session 判断),如果没有登录,我们让它跳转到登录页面。
转载 https://liuyanzhao.com/6300.html
一、拦截器的基本使用
1、新建一个 拦截器
SecurityInterceptor.java
- package com.liuyanzhao.blog.Interceptor;
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.ModelAndView;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class SecurityInterceptor implements HandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
- System.out.println("SecurityInterceptor...preHandle...");
- //这里可以根据session的用户来判断角色的权限,根据权限来转发不同的页面
- if(request.getSession().getAttribute("userId") == null) {
- request.getRequestDispatcher("/login").forward(request,response);
- return false;
- }
- return true;
- }
- @Override
- public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
- }
- @Override
- public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
- }
- }
判断是否有 userId 这个session,如果没有(或者过期了)转发到登录页面
2、配置 springmvc.xml
通过使用 mvc:interceptors 标签来声明需要加入到SpringMVC拦截器链中的拦截器。
- <mvc:interceptors>
- <mvc:interceptor>
- <mvc:mapping path="/admin"/>
- <bean class="com.liuyanzhao.blog.Interceptor.SecurityInterceptor"/>
- </mvc:interceptor>
- <mvc:interceptor>
- <mvc:mapping path="/admin/**"/>
- <bean class="com.liuyanzhao.blog.Interceptor.SecurityInterceptor"/>
- </mvc:interceptor>
- </mvc:interceptors>
只需两步,我们已经能成功拦截 /admin 和其其前缀的如 /admin/article 等其他所有路径啦。
二、登录实现
登录主要是验证该用户是否存在,密码是否正确。然后添加 session 和页面跳转
1、登录表单
login.jsp
- <%
- String username = "";
- String password = "";
- //获取当前站点的所有Cookie
- Cookie[] cookies = request.getCookies();
- for (int i = 0; i < cookies.length; i++) {//对cookies中的数据进行遍历,找到用户名、密码的数据
- if ("username".equals(cookies[i].getName())) {
- username = cookies[i].getValue();
- } else if ("password".equals(cookies[i].getName())) {
- password = cookies[i].getValue();
- }
- }
- %>
- <form name="loginForm" id="loginForm" method="post">
- <input type="text" name="username" id="user_login"
- class="input" value="<%=username%>" size="20" required/></label>
- <input type="password" name="password" id="user_pass"
- class="input" value="<%=password%>" size="20" required/>
- <input name="rememberme" type="checkbox" id="rememberme" value="1" /> 记住密码
- <input type="button" name="wp-submit" id="submit-btn" class="button button-primary button-large" value="登录" />
- </form>
为了代码简洁,这里去掉了多余的标签和属性。我这里是扒了 wordpress 的登录页面,这里也用到了 cookie 。

注意:这里的 form 表单里没有 action 属性,最终发送数据通过 ajax 。同样,也没有 submit 按钮,为了防止 ajax+form+submit 导致 success 里无法页面跳转。
2、js 代码
- <%--登录验证--%>
- $("#submit-btn").click(function () {
- var user = $("#user_login").val();
- var password = $("#user_pass").val();
- if(user=="") {
- alert("用户名不可为空!");
- } else if(password==""){
- alert("密码不可为空!");
- } else {
- $.ajax({
- async: false,//同步,待请求完毕后再执行后面的代码
- type: "POST",
- url: '${pageContext.request.contextPath}/loginVerify',
- contentType: "application/x-www-form-urlencoded; charset=utf-8",
- data: $("#loginForm").serialize(),
- dataType: "json",
- success: function (data) {
- if(data.code==0) {
- alert(data.msg);
- } else {
- window.location.href="${pageContext.request.contextPath}/admin";
- }
- },
- error: function () {
- alert("数据获取失败")
- }
- })
- }
- })
这里 ajax 使用同步,防止出现后台没有返回值,就执行了后面的js代码,进而出现 ajax 执行 error:function() 里的代码。数据类型使用 json,当然也可以使用 text,只不过 text 只能 返回普通的字符串。
最后,如果验证通过,将跳转到 xxx.com/admin 页面(当然后台需要加入session,否则拦截器会拦截)。
3、控制器代码
- //登录页面显示
- @RequestMapping("/login")
- public ModelAndView loginView() {
- ModelAndView modelAndView = new ModelAndView();
- modelAndView.setViewName("/Admin/login");
- return modelAndView;
- }
- //登录验证
- @RequestMapping(value = "/loginVerify",method = RequestMethod.POST)
- @ResponseBody
- public String loginVerify(HttpServletRequest request, HttpServletResponse response) throws Exception {
- Map<String, Object> map = new HashMap<String, Object>();
- String username = request.getParameter("username");
- String password = request.getParameter("password");
- String rememberme = request.getParameter("rememberme");
- UserCustom userCustom = userService.getUserByNameOrEmail(username);
- if(userCustom==null) {
- map.put("code",0);
- map.put("msg","用户名无效!");
- } else if(!userCustom.getUserPass().equals(password)) {
- map.put("code",0);
- map.put("msg","密码错误!");
- } else {
- //登录成功
- map.put("code",1);
- map.put("msg","");
- //添加session
- request.getSession().setAttribute("user", userCustom);
- //添加cookie
- if(rememberme!=null) {
- //创建两个Cookie对象
- Cookie nameCookie = new Cookie("username", username);
- //设置Cookie的有效期为3天
- nameCookie.setMaxAge(60 * 60 * 24 * 3);
- Cookie pwdCookie = new Cookie("password", password);
- pwdCookie.setMaxAge(60 * 60 * 24 * 3);
- response.addCookie(nameCookie);
- response.addCookie(pwdCookie);
- }
- }
- String result = new JSONObject(map).toString();
- return result;
- }
这里登录验证方法内,getUserByNameOrEmail() 方法用来从数据库里查找是否有该用户(用户名或者邮箱)。如果有,而且密码正确,添加一条 session,要和拦截器里写的一致哦。并将信息添加到 Map 中,然后转成 JSON 数据,这里需要导入 对应JSON 的jar 哦。
- <dependency>
- <groupId>org.json</groupId>
- <artifactId>json</artifactId>
- <version>20170516</version>
- </dependency>
是
4、Service 和 DAO
这里就不贴 Service 和 Dao 的代码了,主要就是根据 字符串查找用户的操作啦。
三、注销实现
注销就比较简单了,清除 session 就行了。
1、jsp 页面
- <a href="${pageContext.request.contextPath}/admin/logout">退了</a>
2、控制器代码
- //退出登录
- @RequestMapping(value = "/admin/logout")
- public String logout(HttpSession session) throws Exception {
- session.removeAttribute("userId");
- session.invalidate();
- return "redirect:/login";
- }
SSM 拦截器验证权限和登录与注销的实现的更多相关文章
- SSM博客实战(9)-拦截器验证权限和登录与注销的实现
转载 https://liuyanzhao.com/6300.html
- 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示
1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...
- Struts2使用拦截器完成权限控制示例
http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求: 要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...
- Java结合SpringBoot拦截器实现简单的登录认证模块
Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...
- struts2拦截器-简单实现非法登录验证
概念:什么是拦截器 拦截器实现了面向切面的组件,它会影响多个业务对象的公共行为封装到一个个可重用的模块,减少了系统的重复代码,实现高度内聚,确保业务对象的整洁! 为什么使用拦截器 拦截器消除了动作 ...
- springmvc拦截器验证登录时间
在前一篇[Filter实现用户名验证]的随笔里,记录了如何使用filter 这次增加了拦截器实现 ①filter实现用户登陆时验证用户名是否为null ②interceptor实现用户登陆时时间判断, ...
- Struts2(十四)拦截器实现权限管理
一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...
- 6、Struts2拦截器实现权限控制
1.创建如下项目结果 2.在com.entity包下创建 package com.entity; public class User { private String name; private St ...
- SSM拦截器应用
1.创建工具包 2.编写拦截器业务逻辑类容(在此为验证登录效果) @Override public void doFilter(ServletRequest req, ServletResponse ...
随机推荐
- AtCoder ARC 082E - ConvexScore
传送门:http://arc082.contest.atcoder.jp/tasks/arc082_c 本题是一个平面几何问题. 在平面直角坐标系中有一个n元点集U={Ai(xi,yi)|1≤i≤n} ...
- python 图片滑动窗口
METHOD #1: No smooth, just scaling. def pyramid(image, scale=1.5, minSize=(30, 30)): # yield the ori ...
- Flask中的session操作
一.配置SECRET_KEY 因为flask的session是通过加密之后放到了cookie中.所以有加密就有密钥用于解密,所以,只要用到了flask的session模块就一定要配置“SECRET_K ...
- 重命名文件及html
import os import nltk from bs4 import BeautifulSoup as bs def get_txt_name_from_bak_name(bak_name): ...
- HDU4569 Special equations
/* HDU4569 Special equations http://acm.hdu.edu.cn/showproblem.php?pid=4569 数论 题意:f(x)为一n次方程求是否存在x, ...
- FZU - 1606 - Format the expression
先上题目: Problem 1606 Format the expression Accept: 87 Submit: 390Time Limit: 1000 mSec Memory Li ...
- Ngnix--知识点
ngnix擅长负载 均衡的反向代理 haproxy擅长高可用的反向代理,这个还支持TCP协议 ngnix只能支持HTTP和Email(这个HTTPS需要核实一下) ngnix和haproxy都需要ke ...
- [bzoj2789][Poi2012]Letters_树状数组
Letters bzoj-2789 Poi-2012 题目大意:给定两个字符串A和B,每次交换A中相邻两个数.问至少交换多少次,可以将A变成B. 注释:$2\le n\le 10^6$ 想法:我们发现 ...
- HDU 4530
今天让人看不起了,话说好伤心,说我搞了ACM那么久都没获得拿得出手的奖.... 今晚爷爷我要狂刷2013腾讯马拉松的水题,奶奶滴,哈哈哈哈...T_T #include <iostream> ...
- Thread.suspend和println使线程死锁
Thread.suspend和println使线程死锁 package com.stono.thread2.page39; public class MyThread extends Thread{ ...