1. 程式人生 > >spring系統學習--spirngMVC之session管理

spring系統學習--spirngMVC之session管理

   繼續把spirngmvc的關於session管理的筆記記一下。

第一步:  新建相關處理邏輯的控制器:

package com.automannn.springMVC_practice.controller;

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

import javax.servlet.http.HttpSession;

/**
 * @author 
[email protected]
* @time 2018/11/6 13:05 */ @Controller @SessionAttributes({"currUser"}) @RequestMapping("/user") public class UserController { @GetMapping(value = "/login") public String login(String username, String password, Model model) { String s = "{'username':"+username+",'password':"+password+"}"; model.addAttribute("currUser",s); return "userdetail"; } @ResponseBody @GetMapping(value = "/dologic",produces = "application/json;charset=utf-8") public String dologic(HttpSession session) { Object o = session.getAttribute("currUser"); if (o != null) { return "session:" + o; } else { return "該session為空!"; } } @ResponseBody @GetMapping(value = "/logout") public String logout( HttpSession session) { session.invalidate(); return "success"; } }

    注意,這有個HttpSession,這個依賴在tomcat容器中是自帶的。  但是我們這裡不得不屈服於它的淫威。 因為不引入的話編譯通過不了。    

   這裡的關鍵是:@SessionAttributes(String[])註解。  它是針對整個控制器的 。   它的內容來源是: Model中自動注入。比如這裡的例子。。 

   為了方便起見,我將所有的服務都設定成get方法。  這樣方便測試:

  登陸成功的邏輯,返回自己的登陸頁面:

   這時候訪問doLogic:

   

  當我去登出: logout:

 然後訪問doLogic:

   這樣,實際上springMvc就提供了一種聚合在使用者的controller的一個session管理。 便於業務邏輯的開展。

通常為了完成登陸認證授權等功能,我們需要限制使用者強制登陸,因此可以定義一個過濾器:

 

package com.automannn.springMVC_practice.filter;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author [email protected]
 * @time 2018/11/6 13:34
 */
public class LoginFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest hsq = (HttpServletRequest) request;

       Object o= hsq.getSession().getAttribute("currUser");
       if (o==null){
           ((HttpServletResponse)response).sendRedirect(hsq.getContextPath()+"/user/login?username=111&password=222");
       }
       chain.doFilter(request,response);
    }

    public void destroy() {

    }
}

   注意,我的過濾邏輯是,當session沒有該使用者資訊,就預設先必須登陸。   由於我這裡知識一種邏輯上的操作,所以使用者名稱與密碼是寫死的。

    然後將之配在web.xml中,相當於在tomcat容器中註冊該過濾器。  表示針對user下的所有的資源路徑,我都要進行登陸認證。

 <filter>
        <filter-name>loginFilter</filter-name>
        <filter-class>com.automannn.springMVC_practice.filter.LoginFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>loginFilter</filter-name>
        <url-pattern>/user/*</url-pattern>
    </filter-mapping>

測試:

      在沒有登陸的情況下操作:

將被重定向到登陸頁面(我這裡實際上是重定向到登陸成功介面):

之後再訪問所有的資源:

   

一切正常!