前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >干货!SSM实现登录和退出

干货!SSM实现登录和退出

作者头像
A-My
发布2022-09-19 15:15:43
1.3K0
发布2022-09-19 15:15:43
举报
文章被收录于专栏:A-My

前言

  作为主修Java的我竟然没有发布过一篇有关Java的文章,这究竟是道德的沦丧还是人性的扭曲!额,其实是我太菜了,怕被喷……

  事情是这样的,为了系统的安全,配置了一个拦截器来拦截未登录或session过期的用户,结果把登录页和静态资源也给拦截了,为解决这个问题,配置了mvc:resources和mvc:exclude-mapping后问题仍然存在,于是我就对判断是否拦截下手了。

部分代码

UserController.java:

代码语言:javascript
复制
package com.ddkjt.controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.ddkjt.po.User;
import com.ddkjt.service.UserService;

@Controller("userController")
@RequestMapping("/")
public class UserController {
    
    @Resource(name="userService")
    private UserService userService;

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    
    //登录
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login() {
        return "login";
    }
    
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(User u,Model model,HttpServletResponse response,HttpServletRequest request) {
        User user = userService.login(u);
        //判断用户是否存在
        if(user != null){
            request.getSession().setAttribute("user", user);
            //判断用户是否点击了登录保留一周
            if(request.getParameter("login_time") == "on"){
                request.getSession().setMaxInactiveInterval(7*24*60*60);
            }else{
                request.getSession().setMaxInactiveInterval(2*60*60);
            }
            return "redirect:index";
        }else{
            model.addAttribute("msg","账号和密码不匹配,请重新输入");
            return "login";
        }
    }
    
    //退出登录
    @RequestMapping("/logout")
    public String logout(HttpSession session) {
        session.invalidate();
        return "redirect:login";
    }
    
}

SecurityInterceptor.java:

代码语言:javascript
复制
package com.ddkjt.tool;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class SecurityInterceptor implements HandlerInterceptor{

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
        
    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
        
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
        //判断session是否存在、是否是login页面,访问路径是否包含static
        if(request.getSession().getAttribute("user") == null && !request.getRequestURL().toString().equals(basePath+"login") && !request.getRequestURL().toString().contains("static")) {
            response.sendRedirect(request.getContextPath()+"/login");
            return false;
        }
        return true;
    }

}

spring_mvc.xml:

代码语言:javascript
复制
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.ddkjt.tool.SecurityInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

login.jsp:

代码语言:javascript
复制
<form class="layui-form" method="post" action="./login">
      <div class="layui-form-item">
              <input type="text" name="user_name" placeholder="账号" class="layui-input">
        </div>
        <div class="layui-form-item">
              <input type="password" name="user_pwd" placeholder="密码" class="layui-input">
        </div>
        <div class="layui-form-item">
              <input type="checkbox" name="login_time" title="登录保留一周" checked>
        </div>
        <div class="layui-form-item">
            <input type="submit" class="layui-btn layui-btn-normal layui-btn-fluid" value="登录" />
        </div>
</form>
<script src="static/layui/layui.js" charset="utf-8"></script>
<script src="static/pear/pear.js"></script>
<script type="text/javascript">
    layui.use(['toast','jquery'],function() {
        var $ = layui.jquery;
        var toast = layui.toast;
        if('${msg}' != ''){
            toast.error({title: '错误信息',message: '${msg}',position: 'topCenter'});
        }
        $(".layui-btn").click(function(){
            if($('input[name="user_name"]').val() == '' || $('input[name="user_pwd"]').val() == ''){
                toast.error({title: '错误信息',message: '账号和密码不能为空,请输入',position: 'topCenter'});
                return false;
            }
        });
    });
</script>

结语

本来是用的Ajax提交登录,但返回的结果乱码,就懒得解决了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 部分代码
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档