使用Spring AOP和Cookie做网站免登陆

news/2024/5/18 14:44:40 标签: spring, cookie

在我们平时浏览网站的时候,会发现很多网站,在你登陆一次后,下次登陆就不需要重新登陆了。其原理就是登陆的时候将,Cookie中取出并登陆。下面是js代码

function SetCookie(name, value) {
        var today = new Date();
        var expires = new Date();
        expires.setTime(today.getTime() + 1000*60*60*24*7);
        document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() + ";path=/";
    }

页面登陆时使用js将用户名和密码用Cookie存储起来,;path=/是说明域名下的所有路径都能取得Cookie,不加说明只有此页面的路径可以取得。

后端代码

@Aspect  
@Component  
public class AOP_loginfo {

    @Autowired
    IUserService userService;
    /**  
     * 所有带RequestMapping注解的方法  
     */  
    private final static String el = "@annotation(org.springframework.web.bind.annotation.RequestMapping)";  

    @Before(el)  
    public void before() {

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute(CORER.SESSION_USER);
        Cookie[] cookies = request.getCookies();
        if (cookies != null && user == null) {
            String email = null;
            String password = null;
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if ("email".equals(name)) {
                    email = cookie.getValue();
                }
                if ("password".equals(name)) {
                    password = cookie.getValue();
                }
            }
            user = new User();
            user.setEmail(email);
            user.setPassword(password);
            //登陆
            Message<User> loginMsg = userService.login(user);
            if (loginMsg.isStatus()) {
                user = loginMsg.getData();
                request.getSession().setAttribute(CORER.SESSION_USER, user);
            }
        }
    }  

    @After(el)  
    public void after() {
        System.out.println("执行之后");  
    }  

    @Around(el)  
    public Object around(ProceedingJoinPoint p) {  
        for (Object obj : p.getArgs()) {  
            System.out.println("参数:" + obj);  
        }  
        Object ob = null;  
        try {  
            System.out.println("around前");  
            ob = p.proceed();  
            System.out.println("around后");  
        } catch (Throwable e) {  
            e.printStackTrace();  
        }  

        return ob;  
    }  

    @AfterThrowing(value = el, throwing="e")  
    public void throwing(Exception e){  
        System.out.println("出异常了"+e);  
    }  
}

如果取到用户名和密码并登陆成功,就将信息放入Session中。


后端其实使用过滤器,或者spring的拦截器都是可以实现的。大家可以看怎么方便怎么实现。这是我在一个论坛的开源项目中做的功能,因为项目中,没有spring的xml的配置文件。使用的Spring4和servlet3,零配置文件。最初我用的servlet的过滤器,但WebApplicationContextUtils获取的WebApplicationContext为null,无法得到service来登陆。找了一下原因,是因为项目中没有web.xml即没有添加ContextLoaderListener, WebApplicationContextUtils没有初始化,我试了下在java类中添加此监听器,都没有成功。在一个朋友的帮助下换成了现在这种方法。发现自己对Spring的了解不够,以后准备多阅读些Spring的源码。


http://www.niftyadmin.cn/n/1694939.html

相关文章

从MVC到Ajax再到前后端分离的思考

前言 一位小妹去面试前端&#xff0c;前端leader问了"什么是ajax&#xff1f;"&#xff0c;答&#xff1a;“接收后台的数据&#xff0c;然后然后自己填充和渲染样式”&#xff1b;一位小哥去面试后台&#xff0c;技术经理问了“什么是ajax&#xff1f;”&#xff0c…

Nagios监控远端的mysql

工作原理&#xff1a; 利用特定的用户定期访问指定的mysql数据库。当不能访问或连不通时则报警。 1.在生产库上安装nagios插件 安装略 备注&#xff1a;编译完显示一定要有mysql支持&#xff0c;不然没有check_mysql插件 2.配置mysql ----建立nagdb专用数据库 mysql> …

ios中的奇怪崩溃Signal和EXC_BAD_ACCESS错误分析

什么是Signal 在计算机科学中&#xff0c;信号&#xff08;英语&#xff1a;Signals&#xff09;是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制&#xff0c;用来提醒进程一个事件已经发生。当一个信号发送给一个进程&…

创建dynamics CRM client-side (九) - 用JS来获取look up 信息

我们用以下的代码可以获取到look up 的信息。 大家可以查看微软文档来查看更多关于 lookup object的信息 https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/xrm-utility/lookupobjects 我们可以使用 下面代码来展示信息&#xff1…

机器学习 三 输出

机器学习&#xff1a;输出 机器学习的输出时一系列的模式的表达方式&#xff0c;是推断数据输出结构的技术 以下就是输出结构的表达方式&#xff1a; 一、决策表 与输入的表格相似&#xff0c;从输入表中找到一些合适的条件组合来确定最终的结果 二、决策树 一个决策树上的节点…

(C语言完结)结构体在汇编中的表现形式

一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合 2.在C语言中&#xff0c;结构体(struct)指的是一种数据结构&#xff0c;是C语言中聚合数据类型(aggregate dat…

阻塞队列之ArrayBlockingQueue

阻塞队列 当使用阻塞队列的时候&#xff0c;它可能会对当前线程产生阻塞&#xff0c;&#xff0c;比如一个线程从一个空的阻塞队列中取元素&#xff0c;此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后&#xff0c;被阻塞的线程会自动被唤醒。 部分实现 ArrayBlock…

wpf socket 简单通讯示例

源码下载地址&#xff1a;https://github.com/lizhiqiang0204/WPF-Socket 效果如下&#xff1a; 转载于:https://www.cnblogs.com/lizhiqiang0204/p/11162411.html