在spring mvc登录注销会话

时间:2017-01-28 18:51:14

标签: spring spring-mvc login spring-security logout

我正在尝试为我的项目网站实现登录注销功能。我正在制作SPA。什么是登录/注销全局的最佳方式,即如果我点击任何其他链接,如联系我们或关于我们登录注销后仍然点击?我出错的地方如何纠正? 我应该采用什么逻辑,以便注销保持到最后? 我使用javascript更改登录按钮以退出

我想知道的是,如何根据用户是否登录或退出,如何在整个门户网站和未经身份验证的网站上显示登录/注销按钮?是否有可能以某种方式在标题上执行我的代码?或者您还有其他建议吗?目前,当我点击登录按钮时,temp的值传递为true并显示注销按钮,但是现在当我点击任何其他页面时,关于我们temp的值已经被传递为真..所以如何做到这一点完整的门户网站?

UserController.java

@RequestMapping("/login")
    public ModelAndView loginHere() {
        log.debug("Starting of the method loginHere");
        System.out.println("loginHere");
        ModelAndView mv = new ModelAndView("/home");
        mv.addObject("user", user);
        mv.addObject("isUserClickedLoginHere", "true");
        mv.addObject("message", "Welcome to login page");
        log.debug("Ending of the method loginHere");
        System.out.println("Ending login here");

        return mv;
    }

    @RequestMapping(value = "/validate", method = RequestMethod.GET)
    public ModelAndView validate(@RequestParam(value = "username") String userID,
            @RequestParam(value = "password") String password) {
        log.debug("Starting of the method validate");
        System.out.println("validate");

        ModelAndView mv = new ModelAndView("/home");

        user = userDAO.validate(userID, password);
        // if the record exist with this userID and password it will return user
        // details else will return null
        if (user != null) {
            log.debug("Valid Credentials");

            session = req.getSession();  
/*          session.setMaxInactiveInterval(1*10);
*/          

            session.setAttribute("loggedInUser", user.getName());
            session.setAttribute("loggedInUserID", user.getUsername());

            session.setAttribute("user", user);

            mv.addObject("homePagee", "true");
            mv.addObject("temp", "true");

            if (user.getRole().equals("ROLE_ADMIN")) {
                log.debug("Logged in as Admin");
                mv.addObject("isAdmin", "true");
                /*
                 * session.setAttribute("supplier", supplier);
                 * session.setAttribute("supplierList", supplierDAO.list());
                 * 
                 * session.setAttribute("category", category);
                 * session.setAttribute("categoryList", categoryDAO.list());
                 */

            } else {
                log.debug("Logged in as User");
                mv.addObject("isAdmin", "false");

                // myCart = cartDAO.list(userID);
                /*
                 * mv.addObject("myCart", myCart); // Fetch the myCart list
                 * based on user ID List<MyCart> cartList =
                 * cartDAO.list(userID); mv.addObject("cartList", cartList);
                 * mv.addObject("cartSize", cartList.size());
                 */
            }

        } else {
            log.debug("Invalid Credentials");

            mv.addObject("invalidCredentials", "true");
            mv.addObject("errorMessage", "Invalid Credentials");

        }
        log.debug("Ending of the method validate");
        return mv;
    }

@RequestMapping("/logout")
public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) {
    log.debug("Starting of the method logout");
    System.out.println("Starting of the method logout");

    ModelAndView mv = new ModelAndView("/home");
    session.invalidate();
    session = request.getSession(true);
    mv.addObject("homePagee", "true");
    mv.addObject("temp1", "true");

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    if (auth != null) {
        new SecurityContextLogoutHandler().logout(request, response, auth);
    }
    System.out.println("Ending of the method logout");

    log.debug("Ending of the method logout");
    return mv;
    // return "redirect:/login?logout";

}

Logout.JSP

<c:if test="${temp}">
        <script type="text/javascript">
            /* var loginbtn =  document.getElementById("login-btn");
            var signupbtn = document.getElementById("signup-btn");
            var myaccountbtn = document.getElementById("logout-btn");
            signupbtn.innerHTML = "";
            loginbtn.innerHTML = "";
            myaccountbtn.style.display = "block";
             */
            /*          loginbtn.href = "logout";
             */         

        </script>
    </c:if>
     <c:if test="${temp1}">
                <script>
                    var loginbtn = document.getElementById("login-btn")
                    var signupbtn = document.getElementById("signup-btn")
                    var myaccountbtn = document.getElementById("logout-btn");

                    loginbtn.innerhtml  = "Login";
                    signupbtn.innerHTML = "Signup";
                    loginbtn.href = "login";
                    myaccountbtn.style.display = "none";

                </script>

        </c:if>

的Login.jsp

<div class="container">
        <div class="card card-container">
            <!-- <img class="profile-img-card" src="//lh3.googleusercontent.com/-6V8xOA6M7BA/AAAAAAAAAAI/AAAAAAAAAAA/rzlHcD0KYwo/photo.jpg?sz=120" alt="" /> -->
            <img id="profile-img" class="profile-img-card"
                src="//ssl.gstatic.com/accounts/ui/avatar_2x.png" />
            <p id="profile-name" class="profile-name-card"></p>
            <form class="form-signin" action="validate">
                <span id="reauth-email" class="reauth-email"></span> <input
                    type="username" name="username" id="inputEmail"
                    class="form-control" placeholder="Username" required autofocus>
                <input type="password" name="password" id="inputPassword"
                    class="form-control" placeholder="Password" required> <input
                    type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
                <div id="remember" class="checkbox">
                    <label> <input type="checkbox" value="remember-me">
                        Remember me
                    </label>
                </div>
                <button class="btn btn-lg btn-primary btn-block btn-signin"
                    type="submit">Sign in</button>
            </form>
            <!-- /form -->
            <a href="#" class="forgot-password"> Forgot the password? </a>
        </div>
        <!-- /card-container -->
    </div>
    <!-- /container -->
</div>

header.jsp中

<li class="upper-links"><a class="links" id="signup-btn"
                    href="register">Signup</a></li>

                <li class="upper-links"><a class="links" id="login-btn"
                    href="login">Login</a></li>
                <li class="upper-links dropdown"><a
                    class="dropdown-toggle links" data-toggle="dropdown" role="button"
                    aria-haspopup="true" aria-expanded="false" id="logout-btn"
                    href="loginHere"  style="display: none;">My Account<span class="caret"></span></a>
                    <ul class="dropdown-menu" style="width: 40%;">
                        <li><a href="#">Account</a></li>
                        <li><a href="#">Orders</a></li>
                        <li><a href="#">Wishlist</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="logout">Logout</a></li>
                    </ul></li>

1 个答案:

答案 0 :(得分:1)

您可以为跟踪用户使用Http Session并处理用户登录/注销项目。基于会话,您可以为项目实现其他业务逻辑。

简单登录/注销在控制器中:

@PostMapping("/dologin")
public String userLogin(HttpSession session, @ModelAttribute("user") User 
user, Model model) {
    if (user.getEmail().equals("imranmadbar@gmail.com") && 
    user.getPassword().equals("12345")) {
        user.setFname("MD IMRAN");
        user.setMname("HOSSAIN");
        user.setLname("BABU");
        user.setAge(28);
        session.setAttribute("user", user);
    } else {
        model.addAttribute("message", "Login failed. Try again.");
        return "login";
    }
    return "redirect:/user/info";
}

@GetMapping("/logout")
public String logout(HttpSession session ) {
    session.invalidate();
    return "redirect:/login";
} 

@GetMapping("/info")
    public String userInfo(HttpSession session) {
    return "user";
}

登录用户并在会话范围上设置用户数据后,您可以从项目中的任何一个访问这些数据。

从user.jsp文件访问数据:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page isELIgnored = "false" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
       <title>BORAJI.COM</title>
    </head>
    <body>  

        <h4>User name: ${user.fname} ${user.mname} ${user.mname}</h4>
        <h4>User Age: ${user.age}</h4>
        <h4>User Email: ${user.email}</h4>
        <a href="/LoginRegUsingSession/logout">Log out</a><br>

    </body>
</html>

在我的项目中,我使用弹簧拦截器跟踪用户。 您可以查看我的项目使用此链接
https://github.com/imrangthub/LoginRegUsingSession/tree/master/LoginRegUsingSession

相关问题