继续把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>
测试:
在没有登陆的情况下操作:
将被重定向到登陆页面(我这里实际上是重定向到登陆成功界面):
之后再访问所有的资源:
一切正常!