关于spring-mvc:SSMCookieSession拦截器Interceptor

1 Cookie

Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区倒退的一种机制。

Cookie实际上是一小段的文本信息。客户端申请服务器,如果服务器须要记录该用户状态,就应用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再申请该网站时,浏览器把申请的网址连同该Cookie一起提交给服务器。服务器查看该Cookie,以此来识别用户状态。服务器还能够依据须要批改Cookie的内容。

单点登录中可利用cookie设置实现。

可在浏览器中查看cookie,cookie不能跨域。一对一的关系。

1.1 设置Cookie

Cookie常识介绍:

1.cookie.setPath("/") 代表根目录无效
    url1:www.jt.com/addUser
    url2:www.jt.com/user/addUser
2.cookie.setDomain("域名地址") cookie在哪些域名中共享
    例子1:cookie.setDomain("www.jt.com");//只有在www.jt.com中共享
    cookie.setDomain("jt.com");//在jt.com中共享
3.cookie.setMaxAge(30*24*60*60);//让cookie30天无效。
4.Cookie cookie = new Cookie("JT_TICKET",uuid);
    设置cookie的name和值

例如:

@RestController
public class UserController {
    @RequestMapping("/login")
    public String login(String username, HttpServletResponse response) {
        //创立cookie
        Cookie cookie = new Cookie("username", username);
        //把cookie返回给浏览器
        response.addCookie(cookie);
        return "设置cookie";
    }
}

1.2 读取Cookie

@RestController
public class OrderController {

    @RequestMapping("/getOrder")
    public String getOrder(HttpServletRequest request) {
        //读取所有cookie
        Cookie[] cookies = request.getCookies();
        String string = "";
        if (cookies != null) {
            //遍历cookie
            for (Cookie cookie : cookies) {
                //取cookie名
                String cookieName = cookie.getName();
                //取cookie值
                String cookieValue = cookie.getValue();
                string = string + cookieName + cookieValue;
            }
        }
        return string;
    }

1.3 “删除”Cookie

cookie不能被动删除,如需删除cookie,可从新设置cookie,将无效工夫改为0即可。

Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(0);//让cookie生效
//把cookie返回给浏览器
response.addCookie(cookie);

2 Session

Session是另一种记录客户状态的机制,不同的是Cookie保留在客户端浏览器中,而Session保留在服务器上。客户端浏览器拜访服务器的时候,服务器把客户端信息以某种模式记录在服务器上。这就是Session。

Session对应的类为javax.servlet.http.HttpSession类。

  1. Session是将会话中产生的数据保留在服务器端,是服务器端技术
  2. Session是一个域对象,session中也保留了一个map汇合,往session中存数 据,其实就是将数据保留到session的map汇合中。
  3. 通过session.setAttribute()办法能够将数据保留到session中,通过 session.getAttribute()办法能够将数据从session中取出来。

创建对象:

HttpSession session = request.getSession(); 

调用办法:

String getAttribute(String attribute)读客户状态信息
void setAttribute(String attribute, Object value)办法写客户状态信息
void setMaxInactiveInterval(int second) 设置Session的超时工夫。单位为秒

2.1 设置Session

@RestController
public class CartController {

    @RequestMapping("/insert")
    public String insert(String itemName, HttpSession session) {
        //session外部是有hashmap,用来存放数据
        
        //找到购物车
        ArrayList<String> cart = (ArrayList<String>) session.getAttribute("cart");
        //判断购物车是否为空
        if (cart == null) {
            //创立购物车
            cart = new ArrayList();
            
            //保留购物车
            session.setAttribute("cart", cart);
        }
        //向购物车添置商品
        cart.add(itemName);
        return itemName + "增加到购物车";
    }
}

2.2 获取Session

@RequestMapping("/list")

    public String list(HttpServletRequest request, HttpSession session) {
        String string = "";
        //找到购物车
        ArrayList<String> cart = (ArrayList<String>) session.getAttribute("cart");
        //判断购物车是否为空
        if (cart != null) {
            //遍历商品
            for (String itemName : cart) {
                string = string + "itemName:" + itemName;
            }
        }
        return string;
    }

2.3 销毁session

  1. 超时销毁:默认状况下,当超过30分钟没有拜访session,session就会超时 销毁。(30分钟是默认工夫,能够批改,但不举荐批改)
  2. 他杀:调用session的invalidate办法时,会立刻销毁session。
  3. 意外身亡:当服务器非正常敞开时(硬件损坏,断电,内存溢出等导致服 务器非正常敞开),session会随着服务器的敞开而销毁; 当服务器失常敞开,在敞开之前,服务器会将外部的session对象序列化保 存到服务器的work目录下,变为一个文件。这个过程叫做session的钝化 (序列化);再次将服务器启动起来,钝化着的session会再次回到服务 器,变为服务器中的对象,这个过程叫做session的活化(反序列化)。

(2)作用范畴:在一次会话范畴内(获取到的都是同一个session对象)
(3)次要性能:在整个会话范畴内实现数据的共享

cookie和session的区别

Cookie和session都属于会话技术,都能够保留会话中产生的数据,但因为cookie 和session的工作原理和特点不同,因而两者的利用场景也不一样。

Cookie的特点:

  1. cookie是将会话中产生的数据保留在浏览器客户端, 是客户端技术(JS能够 拜访cookie)
  2. cookie是将数据保留在客户端浏览器,容易随着用户的操作导致cookie失落或者被窃取,因而cookie中保留的数据不太稳固,也不太平安。
  3. 但cookie将数据保留在客户端,对服务器端没有太多影响,能够将数据保留很长时间。
  4. 总结:因而cookie中适宜存储须要长时间保留、但对安全性要求不高的数 据
  5. 浏览器对cookie的大小和个数都有限度,个别举荐每一个站点给浏览器发送的cookie数量不超过20个,每一个cookie的大小不超过1kb。
  6. Cookie的利用:实现购物车、记住用户名、30天内主动登录等。

Session的特点:

  1. session是将会话中产生的数据保留在服务器端,是服务器端技术
  2. session将数据存在服务器端的session对象中,绝对更加的平安,而且更加稳固。不容易随着用户的操作而导致session中的数据失落或者是被窃取。
  3. 但session是服务器端的对象,在并发量较高时每一个浏览器客户端在服务器端都要对应一个session对象,占用服务器的内存空间,影响效率。
  4. 总结:因而session中适宜存储对安全性要求较高,但不须要长时间保留的数据。
  5. Session的利用:保留登录状态、保留验证码。

拦截器Interceptor

性能分外围业务性能和扩大性能。
外围业务性能如登录,增加购物车,查问订单。
扩大性能如计算工夫,身份验证,日志,扩大性能放在Interceptor中,拜访controller时主动执行。不批改controller代码就实现了扩大性能。这种形式也叫无侵入性编码,动静代理

自定义拦截器实现了HandlerInterceptor接口,并实现了接口中的三个办法:

  • preHandle() 办法:该办法会在控制器办法前执行,其返回值示意是否中断后续操作。当其返回值为true时,示意持续向下执行; 当其返回值为false时,会中断后续的所有操作(包含调用下一个拦截器和控制器类中的办法执行等)。
  • postHandle()办法:该办法会在控制器办法调用之后,且解析视图之前执行。能够通过此办法对申请域中的模型和视图做出进一步的批改。
  • afterCompletion()办法:该办法会在整个申请实现,即视图渲染完结之后执行。能够通过此办法实现一些资源清理、记录日志信息等工作。

实现身份验证性能

创立AuthInterceptor拦截器:

public class AuthInterceptor implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler)
            throws Exception {
        String url=request.getRequestURI();
        System.out.println(url+" AuthInterceptor.preHandle()");
        
        //判断用户有没有登录
        HttpSession session=request.getSession();
        String username=(String) session.getAttribute("username");
        if (StringUtils.isEmpty(username)) {
            response.sendRedirect("/login.html");
return false;// false 不执行controller,postHandle()
        }
        return true;// false 不执行controller,postHandle()
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("AuthInterceptor.postHandle()");

        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

}

在配置文件config中增加authInterceptor:
将config对象交给bean容器进行治理。

@Component//这是个组件,框架会主动创建对象
public class WebConfig implements WebMvcConfigurer{

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        
        AuthInterceptor authInterceptor=new AuthInterceptor();        
        registry.addInterceptor(authInterceptor).addPathPatterns("/getOrder","/list");
        
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理